18650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// Copyright (C) 2011 The Android Open Source Project 28650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// 38650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// Licensed under the Apache License, Version 2.0 (the "License"); 48650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// you may not use this file except in compliance with the License. 58650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// You may obtain a copy of the License at 68650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// 78650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// http://www.apache.org/licenses/LICENSE-2.0 88650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// 98650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// Unless required by applicable law or agreed to in writing, software 108650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// distributed under the License is distributed on an "AS IS" BASIS, 118650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 128650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// See the License for the specific language governing permissions and 138650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk// limitations under the License. 148650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 158650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk#pragma version(1) 168650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 178650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk#pragma rs java_package_name(com.android.fbotest) 188650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 198650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk#include "rs_graphics.rsh" 208650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 218650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_program_vertex gPVBackground; 228650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_program_fragment gPFBackground; 238650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 248650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_allocation gTGrid; 258650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 268650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_program_store gPFSBackground; 278650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 288650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_font gItalic; 298650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_allocation gTextAlloc; 308650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 318650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_allocation gOffscreen; 328650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_allocation gOffscreenDepth; 338650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukrs_allocation gReadBackTest; 348650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 358650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouktypedef struct MeshInfo { 368650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rs_mesh mMesh; 378650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk int mNumIndexSets; 388650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk float3 bBoxMin; 398650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk float3 bBoxMax; 408650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk} MeshInfo_t; 418650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 428650c32907b74b945dd6cc9a5bf41c12fde005dfAlex SakhartchoukMeshInfo_t *gMeshes; 438650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 448650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic float3 gLookAt; 458650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 468650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic float gRotateX; 478650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic float gRotateY; 488650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic float gZoom; 498650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 508650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic float gLastX; 518650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic float gLastY; 528650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 538650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukvoid onActionDown(float x, float y) { 548650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gLastX = x; 558650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gLastY = y; 568650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk} 578650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 588650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukvoid onActionScale(float scale) { 598650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 608650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gZoom *= 1.0f / scale; 618650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gZoom = max(0.1f, min(gZoom, 500.0f)); 628650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk} 638650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 648650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukvoid onActionMove(float x, float y) { 658650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk float dx = gLastX - x; 668650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk float dy = gLastY - y; 678650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 688650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk if (fabs(dy) <= 2.0f) { 698650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk dy = 0.0f; 708650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk } 718650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk if (fabs(dx) <= 2.0f) { 728650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk dx = 0.0f; 738650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk } 748650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 758650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gRotateY -= dx; 768650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk if (gRotateY > 360) { 778650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gRotateY -= 360; 788650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk } 798650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk if (gRotateY < 0) { 808650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gRotateY += 360; 818650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk } 828650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 838650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gRotateX -= dy; 848650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gRotateX = min(gRotateX, 80.0f); 858650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gRotateX = max(gRotateX, -80.0f); 868650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 878650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gLastX = x; 888650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gLastY = y; 898650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk} 908650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 918650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukvoid init() { 928650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gRotateX = 0.0f; 938650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gRotateY = 0.0f; 948650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gZoom = 50.0f; 958650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gLookAt = 0.0f; 968650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk} 978650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 988650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukvoid updateMeshInfo() { 998650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rs_allocation allMeshes = rsGetAllocation(gMeshes); 1008650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk int size = rsAllocationGetDimX(allMeshes); 1018650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gLookAt = 0.0f; 1028650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk float minX, minY, minZ, maxX, maxY, maxZ; 1038650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk for (int i = 0; i < size; i++) { 1048650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk MeshInfo_t *info = (MeshInfo_t*)rsGetElementAt(allMeshes, i); 1058650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgMeshComputeBoundingBox(info->mMesh, 1068650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk &minX, &minY, &minZ, 1078650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk &maxX, &maxY, &maxZ); 10838b78b1bf5dd564bf8e6c022eaba3ef6a21a3d03Jason Sams info->bBoxMin = (float3){minX, minY, minZ}; 10938b78b1bf5dd564bf8e6c022eaba3ef6a21a3d03Jason Sams info->bBoxMax = (float3){maxX, maxY, maxZ}; 1108650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gLookAt += (info->bBoxMin + info->bBoxMax)*0.5f; 1118650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk } 1128650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gLookAt = gLookAt / (float)size; 1138650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk} 1148650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1158650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic void renderAllMeshes() { 1168650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rs_allocation allMeshes = rsGetAllocation(gMeshes); 1178650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk int size = rsAllocationGetDimX(allMeshes); 1188650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gLookAt = 0.0f; 1198650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk float minX, minY, minZ, maxX, maxY, maxZ; 1208650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk for (int i = 0; i < size; i++) { 1218650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk MeshInfo_t *info = (MeshInfo_t*)rsGetElementAt(allMeshes, i); 1228650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgDrawMesh(info->mMesh); 1238650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk } 1248650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk} 1258650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1268650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic void drawDescription() { 1278650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk uint width = rsgGetWidth(); 1288650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk uint height = rsgGetHeight(); 1298650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk int left = 0, right = 0, top = 0, bottom = 0; 1308650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1318650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgBindFont(gItalic); 1328650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1338650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgMeasureText(gTextAlloc, &left, &right, &top, &bottom); 1348650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgDrawText(gTextAlloc, 2 -left, height - 2 + bottom); 1358650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk} 1368650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1378650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic void renderOffscreen(bool useDepth) { 1388650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1398650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgBindColorTarget(gOffscreen, 0); 1408650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk if (useDepth) { 1418650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgBindDepthTarget(gOffscreenDepth); 1428650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgClearDepth(1.0f); 1438650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk } else { 1448650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgClearDepthTarget(); 1458650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk } 1468650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgClearColor(0.8f, 0.0f, 0.0f, 1.0f); 1478650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1488650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgBindProgramVertex(gPVBackground); 1498650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rs_matrix4x4 proj; 1508650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk float aspect = (float)rsAllocationGetDimX(gOffscreen) / (float)rsAllocationGetDimY(gOffscreen); 1518650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsMatrixLoadPerspective(&proj, 30.0f, aspect, 1.0f, 100.0f); 1528650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgProgramVertexLoadProjectionMatrix(&proj); 1538650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1548650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgBindProgramFragment(gPFBackground); 1558650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgBindProgramStore(gPFSBackground); 1568650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgBindTexture(gPFBackground, 0, gTGrid); 1578650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1588650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rs_matrix4x4 matrix; 1598650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsMatrixLoadIdentity(&matrix); 1608650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk // Position our models on the screen 1618650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsMatrixTranslate(&matrix, gLookAt.x, gLookAt.y, gLookAt.z - gZoom); 1628650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsMatrixRotate(&matrix, gRotateX, 1.0f, 0.0f, 0.0f); 1638650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsMatrixRotate(&matrix, gRotateY, 0.0f, 1.0f, 0.0f); 1648650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgProgramVertexLoadModelMatrix(&matrix); 1658650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1668650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk renderAllMeshes(); 1678650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1688650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk // Render into the frambuffer 1698650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgClearAllRenderTargets(); 1708650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk} 1718650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1728650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukstatic void drawOffscreenResult(int posX, int posY, rs_allocation texture) { 1738650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk // display the result 1748650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rs_matrix4x4 proj, matrix; 1758650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsMatrixLoadOrtho(&proj, 0, rsgGetWidth(), rsgGetHeight(), 0, -500, 500); 1768650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgProgramVertexLoadProjectionMatrix(&proj); 1778650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsMatrixLoadIdentity(&matrix); 1788650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgProgramVertexLoadModelMatrix(&matrix); 1798650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgBindTexture(gPFBackground, 0, texture); 1808650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk float startX = posX, startY = posY; 1818650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk float width = 256, height = 256; 1828650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgDrawQuadTexCoords(startX, startY, 0, 0, 1, 1838650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk startX, startY + height, 0, 0, 0, 1848650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk startX + width, startY + height, 0, 1, 0, 1858650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk startX + width, startY, 0, 1, 1); 1868650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk} 1878650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1888650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchoukint root(void) { 1898650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1908650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgClearColor(1.0f, 1.0f, 1.0f, 1.0f); 1918650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgClearDepth(1.0f); 1928650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1938650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk renderOffscreen(true); 1948650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk drawOffscreenResult(0, 0, gOffscreen); 1958650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1968650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 1978650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk uint32_t w = rsAllocationGetDimX(gOffscreen); 1988650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk uint32_t h = rsAllocationGetDimY(gOffscreen); 1998650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk uint32_t numElements = w*h; 2008650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 2018650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgAllocationSyncAll(gOffscreen, RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET); 2028650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 2038650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsAllocationCopy2DRange(gReadBackTest, 0, 0, 0, 2048650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, w, h, 2058650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk gOffscreen, 0, 0, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X); 2068650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 2078650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgAllocationSyncAll(gReadBackTest); 2088650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk drawOffscreenResult(0, 300, gReadBackTest); 2098650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 2108650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgBindProgramVertex(gPVBackground); 2118650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rs_matrix4x4 proj; 2128650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk float aspect = (float)rsgGetWidth() / (float)rsgGetHeight(); 2138650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsMatrixLoadPerspective(&proj, 30.0f, aspect, 1.0f, 100.0f); 2148650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgProgramVertexLoadProjectionMatrix(&proj); 2158650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 2168650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgBindProgramFragment(gPFBackground); 2178650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgBindProgramStore(gPFSBackground); 2188650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgBindTexture(gPFBackground, 0, gTGrid); 2198650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 2208650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rs_matrix4x4 matrix; 2218650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsMatrixLoadIdentity(&matrix); 2228650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk // Position our models on the screen 2238650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsMatrixTranslate(&matrix, gLookAt.x, gLookAt.y, gLookAt.z - gZoom); 2248650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsMatrixRotate(&matrix, gRotateX, 1.0f, 0.0f, 0.0f); 2258650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsMatrixRotate(&matrix, gRotateY, 0.0f, 1.0f, 0.0f); 2268650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk rsgProgramVertexLoadModelMatrix(&matrix); 2278650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 2288650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk renderAllMeshes(); 2298650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 2308650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk drawDescription(); 2318650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk 2328650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk return 0; 2338650c32907b74b945dd6cc9a5bf41c12fde005dfAlex Sakhartchouk} 234