18e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk// Copyright (C) 2011 The Android Open Source Project
28e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk//
38e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk// Licensed under the Apache License, Version 2.0 (the "License");
48e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk// you may not use this file except in compliance with the License.
58e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk// You may obtain a copy of the License at
68e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk//
78e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk//      http://www.apache.org/licenses/LICENSE-2.0
88e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk//
98e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk// Unless required by applicable law or agreed to in writing, software
108e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk// distributed under the License is distributed on an "AS IS" BASIS,
118e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
128e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk// See the License for the specific language governing permissions and
138e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk// limitations under the License.
148e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
158e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk#pragma version(1)
168e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
178e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk#pragma rs java_package_name(com.android.fbotest)
188e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
198e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk#include "rs_graphics.rsh"
208e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
218e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukrs_program_vertex gPVBackground;
228e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukrs_program_fragment gPFBackground;
238e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
248e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukrs_allocation gTGrid;
258e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
268e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukrs_program_store gPFSBackground;
278e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
288e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukrs_font gItalic;
298e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukrs_allocation gTextAlloc;
308e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
318e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukrs_allocation gOffscreen;
328e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukrs_allocation gOffscreenDepth;
338e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
348e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouktypedef struct MeshInfo {
358e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rs_mesh mMesh;
368e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    int mNumIndexSets;
378e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    float3 bBoxMin;
388e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    float3 bBoxMax;
398e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk} MeshInfo_t;
408e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
418e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex SakhartchoukMeshInfo_t *gMeshes;
428e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
438e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukstatic float3 gLookAt;
448e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
458e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukstatic float gRotateX;
468e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukstatic float gRotateY;
478e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukstatic float gZoom;
488e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
498e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukstatic float gLastX;
508e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukstatic float gLastY;
518e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
528e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukvoid onActionDown(float x, float y) {
538e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gLastX = x;
548e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gLastY = y;
558e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk}
568e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
578e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukvoid onActionScale(float scale) {
588e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
598e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gZoom *= 1.0f / scale;
608e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gZoom = max(0.1f, min(gZoom, 500.0f));
618e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk}
628e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
638e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukvoid onActionMove(float x, float y) {
648e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    float dx = gLastX - x;
658e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    float dy = gLastY - y;
668e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
678e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    if (fabs(dy) <= 2.0f) {
688e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        dy = 0.0f;
698e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
708e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    if (fabs(dx) <= 2.0f) {
718e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        dx = 0.0f;
728e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
738e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
748e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gRotateY -= dx;
758e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    if (gRotateY > 360) {
768e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        gRotateY -= 360;
778e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
788e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    if (gRotateY < 0) {
798e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        gRotateY += 360;
808e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
818e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
828e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gRotateX -= dy;
838e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gRotateX = min(gRotateX, 80.0f);
848e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gRotateX = max(gRotateX, -80.0f);
858e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
868e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gLastX = x;
878e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gLastY = y;
888e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk}
898e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
908e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukvoid init() {
918e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gRotateX = 0.0f;
928e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gRotateY = 0.0f;
938e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gZoom = 50.0f;
948e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gLookAt = 0.0f;
958e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk}
968e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
978e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukvoid updateMeshInfo() {
988e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rs_allocation allMeshes = rsGetAllocation(gMeshes);
998e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    int size = rsAllocationGetDimX(allMeshes);
1008e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gLookAt = 0.0f;
1018e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    float minX, minY, minZ, maxX, maxY, maxZ;
1028e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    for (int i = 0; i < size; i++) {
1038e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        MeshInfo_t *info = (MeshInfo_t*)rsGetElementAt(allMeshes, i);
1048e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        rsgMeshComputeBoundingBox(info->mMesh,
1058e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                                  &minX, &minY, &minZ,
1068e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                                  &maxX, &maxY, &maxZ);
10738b78b1bf5dd564bf8e6c022eaba3ef6a21a3d03Jason Sams        info->bBoxMin = (float3){minX, minY, minZ};
10838b78b1bf5dd564bf8e6c022eaba3ef6a21a3d03Jason Sams        info->bBoxMax = (float3){maxX, maxY, maxZ};
1098e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        gLookAt += (info->bBoxMin + info->bBoxMax)*0.5f;
1108e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
1118e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gLookAt = gLookAt / (float)size;
1128e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk}
1138e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1148e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukstatic void renderAllMeshes() {
1158e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rs_allocation allMeshes = rsGetAllocation(gMeshes);
1168e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    int size = rsAllocationGetDimX(allMeshes);
1178e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    gLookAt = 0.0f;
1188e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    float minX, minY, minZ, maxX, maxY, maxZ;
1198e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    for (int i = 0; i < size; i++) {
1208e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        MeshInfo_t *info = (MeshInfo_t*)rsGetElementAt(allMeshes, i);
1218e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        rsgDrawMesh(info->mMesh);
1228e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
1238e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk}
1248e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1258e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukstatic void drawDescription() {
1268e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    uint width = rsgGetWidth();
1278e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    uint height = rsgGetHeight();
1288e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    int left = 0, right = 0, top = 0, bottom = 0;
1298e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1308e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgBindFont(gItalic);
1318e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1328e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgMeasureText(gTextAlloc, &left, &right, &top, &bottom);
1338e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgDrawText(gTextAlloc, 2 -left, height - 2 + bottom);
1348e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk}
1358e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1368e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukstatic void renderOffscreen(bool useDepth) {
1378e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1388e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgBindColorTarget(gOffscreen, 0);
1398e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    if (useDepth) {
1408e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        rsgBindDepthTarget(gOffscreenDepth);
1418e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        rsgClearDepth(1.0f);
1428e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    } else {
1438e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk        rsgClearDepthTarget();
1448e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    }
1458e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgClearColor(0.8f, 0.8f, 0.8f, 1.0f);
1468e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1478e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgBindProgramVertex(gPVBackground);
1488e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rs_matrix4x4 proj;
1498e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    float aspect = (float)rsAllocationGetDimX(gOffscreen) / (float)rsAllocationGetDimY(gOffscreen);
1508e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsMatrixLoadPerspective(&proj, 30.0f, aspect, 1.0f, 100.0f);
1518e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgProgramVertexLoadProjectionMatrix(&proj);
1528e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1538e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgBindProgramFragment(gPFBackground);
1548e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgBindProgramStore(gPFSBackground);
1558e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgBindTexture(gPFBackground, 0, gTGrid);
1568e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1578e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rs_matrix4x4 matrix;
1588e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsMatrixLoadIdentity(&matrix);
1598e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    // Position our models on the screen
1608e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsMatrixTranslate(&matrix, gLookAt.x, gLookAt.y, gLookAt.z - gZoom);
1618e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsMatrixRotate(&matrix, gRotateX, 1.0f, 0.0f, 0.0f);
1628e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsMatrixRotate(&matrix, gRotateY, 0.0f, 1.0f, 0.0f);
1638e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgProgramVertexLoadModelMatrix(&matrix);
1648e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1658e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    renderAllMeshes();
1668e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1678e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    // Render into the frambuffer
1688e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgClearAllRenderTargets();
1698e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk}
1708e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1718e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchoukstatic void drawOffscreenResult(int posX, int posY) {
1728e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    // display the result
1738e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rs_matrix4x4 proj, matrix;
1748e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsMatrixLoadOrtho(&proj, 0, rsgGetWidth(), rsgGetHeight(), 0, -500, 500);
1758e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgProgramVertexLoadProjectionMatrix(&proj);
1768e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsMatrixLoadIdentity(&matrix);
1778e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgProgramVertexLoadModelMatrix(&matrix);
1788e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgBindTexture(gPFBackground, 0, gOffscreen);
1798e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    float startX = posX, startY = posY;
1808e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    float width = 256, height = 256;
1818e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgDrawQuadTexCoords(startX, startY, 0, 0, 1,
1828e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                         startX, startY + height, 0, 0, 0,
1838e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                         startX + width, startY + height, 0, 1, 0,
1848e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk                         startX + width, startY, 0, 1, 1);
1858e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk}
1868e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
187b994ed33c52b0010e59d1aad240577e11c85d593Stephen Hinesint root(void) {
1888e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1898e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgClearColor(1.0f, 1.0f, 1.0f, 1.0f);
1908e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgClearDepth(1.0f);
1918e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1928e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    renderOffscreen(true);
1938e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    drawOffscreenResult(0, 0);
1948e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1958e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    renderOffscreen(false);
1968e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    drawOffscreenResult(0, 256);
1978e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
1988e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgBindProgramVertex(gPVBackground);
1998e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rs_matrix4x4 proj;
2008e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    float aspect = (float)rsgGetWidth() / (float)rsgGetHeight();
2018e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsMatrixLoadPerspective(&proj, 30.0f, aspect, 1.0f, 100.0f);
2028e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgProgramVertexLoadProjectionMatrix(&proj);
2038e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
2048e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgBindProgramFragment(gPFBackground);
2058e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgBindProgramStore(gPFSBackground);
2068e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgBindTexture(gPFBackground, 0, gTGrid);
2078e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
2088e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rs_matrix4x4 matrix;
2098e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsMatrixLoadIdentity(&matrix);
2108e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    // Position our models on the screen
2118e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsMatrixTranslate(&matrix, gLookAt.x, gLookAt.y, gLookAt.z - gZoom);
2128e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsMatrixRotate(&matrix, gRotateX, 1.0f, 0.0f, 0.0f);
2138e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsMatrixRotate(&matrix, gRotateY, 0.0f, 1.0f, 0.0f);
2148e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    rsgProgramVertexLoadModelMatrix(&matrix);
2158e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
2168e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    renderAllMeshes();
2178e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
2188e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    drawDescription();
2198e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk
2208e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk    return 0;
2218e90f2bc1fa35a2dc7bd2aab8b8241b628800218Alex Sakhartchouk}
222