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