History

use Austins QUAD to TRIANGLE_STRIP approach

ZappoMan committed 11 years ago

Commit b138c161 parent 05a4a6a2 files · +14 −77Browse files

Showing the changes to libraries/render-utils/src/GeometryCache.cpp (1 of 2 files). Show all

Unified · Split

libraries/render-utils/src/GeometryCache.cpp+14−75
@@ -1012,27 +1012,21 @@ void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec2& minCorner, co · 1011 unmodified lines
1012 }1012 }
1013 1013
1014 const int FLOATS_PER_VERTEX = 2; // vertices1014 const int FLOATS_PER_VERTEX = 2; // vertices
1015 const int NUMBER_OF_INDICES = 6; // 1 quad = 2 triangles
1016 const int VERTICES = 4; // 1 quad = 4 vertices1015 const int VERTICES = 4; // 1 quad = 4 vertices
1017 1016
1018 if (!details.isCreated) {1017 if (!details.isCreated) {
1019 1018
1020 details.isCreated = true;1019 details.isCreated = true;
1021 details.vertices = VERTICES;1020 details.vertices = VERTICES;
1022 details.indices = NUMBER_OF_INDICES;
1023 details.vertexSize = FLOATS_PER_VERTEX;1021 details.vertexSize = FLOATS_PER_VERTEX;
1024 1022
1025 auto verticesBuffer = std::make_shared<gpu::Buffer>();1023 auto verticesBuffer = std::make_shared<gpu::Buffer>();
1026 auto colorBuffer = std::make_shared<gpu::Buffer>();1024 auto colorBuffer = std::make_shared<gpu::Buffer>();
1027 auto indicesBuffer = std::make_shared<gpu::Buffer>();
1028
1029 auto streamFormat = std::make_shared<gpu::Stream::Format>();1025 auto streamFormat = std::make_shared<gpu::Stream::Format>();
1030 auto stream = std::make_shared<gpu::BufferStream>();1026 auto stream = std::make_shared<gpu::BufferStream>();
1031 1027
1032 details.verticesBuffer = verticesBuffer;1028 details.verticesBuffer = verticesBuffer;
1033 details.colorBuffer = colorBuffer;1029 details.colorBuffer = colorBuffer;
1034 details.indicesBuffer = indicesBuffer;
1035
1036 details.streamFormat = streamFormat;1030 details.streamFormat = streamFormat;
1037 details.stream = stream;1031 details.stream = stream;
1038 1032
@@ -1046,8 +1040,9 @@ void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec2& minCorner, co · 7 unmodified lines
1046 float vertexBuffer[VERTICES * FLOATS_PER_VERTEX] = { 1040 float vertexBuffer[VERTICES * FLOATS_PER_VERTEX] = {
1047 minCorner.x, minCorner.y,1041 minCorner.x, minCorner.y,
1048 maxCorner.x, minCorner.y,1042 maxCorner.x, minCorner.y,
1049 maxCorner.x, maxCorner.y,1043 minCorner.x, maxCorner.y,
1050 minCorner.x, maxCorner.y };1044 maxCorner.x, maxCorner.y
1045 };
1051 1046
1052 const int NUM_COLOR_SCALARS_PER_QUAD = 4;1047 const int NUM_COLOR_SCALARS_PER_QUAD = 4;
1053 int compactColor = ((int(color.x * 255.0f) & 0xFF)) |1048 int compactColor = ((int(color.x * 255.0f) & 0xFF)) |
@@ -1056,24 +1051,13 @@ void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec2& minCorner, co · 2 unmodified lines
1056 ((int(color.w * 255.0f) & 0xFF) << 24);1051 ((int(color.w * 255.0f) & 0xFF) << 24);
1057 int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor };1052 int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor };
1058 1053
1059 // Sam's recommended triangle slices
1060 // Triangle tri1 = { v0, v1, v3 };
1061 // Triangle tri2 = { v1, v2, v3 };
1062 // NOTE: Random guy on the internet's recommended triangle slices
1063 // Triangle tri1 = { v0, v1, v2 };
1064 // Triangle tri2 = { v2, v3, v0 };
1065
1066 quint16 indices[NUMBER_OF_INDICES] = { 0, 1, 3, 1, 2, 3 };
1067
1068 details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Byte*) vertexBuffer);1054 details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Byte*) vertexBuffer);
1069 details.colorBuffer->append(sizeof(colors), (gpu::Byte*) colors);1055 details.colorBuffer->append(sizeof(colors), (gpu::Byte*) colors);
1070 details.indicesBuffer->append(sizeof(indices), (gpu::Byte*) indices);
1071 }1056 }
1072 1057
1073 batch.setInputFormat(details.streamFormat);1058 batch.setInputFormat(details.streamFormat);
1074 batch.setInputStream(0, *details.stream);1059 batch.setInputStream(0, *details.stream);
1075 batch.setIndexBuffer(gpu::UINT16, details.indicesBuffer, 0);1060 batch.draw(gpu::TRIANGLE_STRIP, 4, 0);
1076 batch.drawIndexed(gpu::TRIANGLES, NUMBER_OF_INDICES, 0);
1077}1061}
1078 1062
1079void GeometryCache::renderUnitCube(gpu::Batch& batch) {1063void GeometryCache::renderUnitCube(gpu::Batch& batch) {
@@ -1121,25 +1105,21 @@ void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec2& minCorner, co · 41 unmodified lines
1121 const int VERTICES = 4; // 1 quad = 4 vertices1105 const int VERTICES = 4; // 1 quad = 4 vertices
1122 const int NUM_POS_COORDS = 2;1106 const int NUM_POS_COORDS = 2;
1123 const int VERTEX_TEXCOORD_OFFSET = NUM_POS_COORDS * sizeof(float);1107 const int VERTEX_TEXCOORD_OFFSET = NUM_POS_COORDS * sizeof(float);
1124 const int NUMBER_OF_INDICES = 6; // 1 quad = 2 triangles
1125 1108
1126 if (!details.isCreated) {1109 if (!details.isCreated) {
1127 1110
1128 details.isCreated = true;1111 details.isCreated = true;
1129 details.vertices = VERTICES;1112 details.vertices = VERTICES;
1130 details.indices = NUMBER_OF_INDICES;
1131 details.vertexSize = FLOATS_PER_VERTEX;1113 details.vertexSize = FLOATS_PER_VERTEX;
1132 1114
1133 auto verticesBuffer = std::make_shared<gpu::Buffer>();1115 auto verticesBuffer = std::make_shared<gpu::Buffer>();
1134 auto colorBuffer = std::make_shared<gpu::Buffer>();1116 auto colorBuffer = std::make_shared<gpu::Buffer>();
1135 auto indicesBuffer = std::make_shared<gpu::Buffer>();
1136 1117
1137 auto streamFormat = std::make_shared<gpu::Stream::Format>();1118 auto streamFormat = std::make_shared<gpu::Stream::Format>();
1138 auto stream = std::make_shared<gpu::BufferStream>();1119 auto stream = std::make_shared<gpu::BufferStream>();
1139 1120
1140 details.verticesBuffer = verticesBuffer;1121 details.verticesBuffer = verticesBuffer;
1141 details.colorBuffer = colorBuffer;1122 details.colorBuffer = colorBuffer;
1142 details.indicesBuffer = indicesBuffer;
1143 1123
1144 details.streamFormat = streamFormat;1124 details.streamFormat = streamFormat;
1145 details.stream = stream;1125 details.stream = stream;
@@ -1155,8 +1135,9 @@ void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec2& minCorner, co · 9 unmodified lines
1155 float vertexBuffer[VERTICES * FLOATS_PER_VERTEX] = { 1135 float vertexBuffer[VERTICES * FLOATS_PER_VERTEX] = {
1156 minCorner.x, minCorner.y, texCoordMinCorner.x, texCoordMinCorner.y,1136 minCorner.x, minCorner.y, texCoordMinCorner.x, texCoordMinCorner.y,
1157 maxCorner.x, minCorner.y, texCoordMaxCorner.x, texCoordMinCorner.y,1137 maxCorner.x, minCorner.y, texCoordMaxCorner.x, texCoordMinCorner.y,
1158 maxCorner.x, maxCorner.y, texCoordMaxCorner.x, texCoordMaxCorner.y,1138 minCorner.x, maxCorner.y, texCoordMinCorner.x, texCoordMaxCorner.y,
1159 minCorner.x, maxCorner.y, texCoordMinCorner.x, texCoordMaxCorner.y };1139 maxCorner.x, maxCorner.y, texCoordMaxCorner.x, texCoordMaxCorner.y
1140 };
1160 1141
1161 1142
1162 const int NUM_COLOR_SCALARS_PER_QUAD = 4;1143 const int NUM_COLOR_SCALARS_PER_QUAD = 4;
@@ -1166,24 +1147,13 @@ void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec2& minCorner, co · 3 unmodified lines
1166 ((int(color.w * 255.0f) & 0xFF) << 24);1147 ((int(color.w * 255.0f) & 0xFF) << 24);
1167 int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor };1148 int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor };
1168 1149
1169 // Sam's recommended triangle slices
1170 // Triangle tri1 = { v0, v1, v3 };
1171 // Triangle tri2 = { v1, v2, v3 };
1172 // NOTE: Random guy on the internet's recommended triangle slices
1173 // Triangle tri1 = { v0, v1, v2 };
1174 // Triangle tri2 = { v2, v3, v0 };
1175
1176 quint16 indices[NUMBER_OF_INDICES] = { 0, 1, 3, 1, 2, 3 };
1177
1178 details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Byte*) vertexBuffer);1150 details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Byte*) vertexBuffer);
1179 details.colorBuffer->append(sizeof(colors), (gpu::Byte*) colors);1151 details.colorBuffer->append(sizeof(colors), (gpu::Byte*) colors);
1180 details.indicesBuffer->append(sizeof(indices), (gpu::Byte*) indices);
1181 }1152 }
1182 1153
1183 batch.setInputFormat(details.streamFormat);1154 batch.setInputFormat(details.streamFormat);
1184 batch.setInputStream(0, *details.stream);1155 batch.setInputStream(0, *details.stream);
1185 batch.setIndexBuffer(gpu::UINT16, details.indicesBuffer, 0);1156 batch.draw(gpu::TRIANGLE_STRIP, 4, 0);
1186 batch.drawIndexed(gpu::TRIANGLES, NUMBER_OF_INDICES, 0);
1187}1157}
1188 1158
1189void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec3& minCorner, const glm::vec3& maxCorner, const glm::vec4& color, int id) {1159void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec3& minCorner, const glm::vec3& maxCorner, const glm::vec4& color, int id) {
@@ -1209,26 +1179,22 @@ void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec3& minCorner, co · 19 unmodified lines
1209 }1179 }
1210 1180
1211 const int FLOATS_PER_VERTEX = 3; // vertices1181 const int FLOATS_PER_VERTEX = 3; // vertices
1212 const int NUMBER_OF_INDICES = 6; // 1 quad = 2 triangles
1213 const int VERTICES = 4; // 1 quad = 4 vertices1182 const int VERTICES = 4; // 1 quad = 4 vertices
1214 1183
1215 if (!details.isCreated) {1184 if (!details.isCreated) {
1216 1185
1217 details.isCreated = true;1186 details.isCreated = true;
1218 details.vertices = VERTICES;1187 details.vertices = VERTICES;
1219 details.indices = NUMBER_OF_INDICES;
1220 details.vertexSize = FLOATS_PER_VERTEX;1188 details.vertexSize = FLOATS_PER_VERTEX;
1221 1189
1222 auto verticesBuffer = std::make_shared<gpu::Buffer>();1190 auto verticesBuffer = std::make_shared<gpu::Buffer>();
1223 auto colorBuffer = std::make_shared<gpu::Buffer>();1191 auto colorBuffer = std::make_shared<gpu::Buffer>();
1224 auto indicesBuffer = std::make_shared<gpu::Buffer>();
1225 1192
1226 auto streamFormat = std::make_shared<gpu::Stream::Format>();1193 auto streamFormat = std::make_shared<gpu::Stream::Format>();
1227 auto stream = std::make_shared<gpu::BufferStream>();1194 auto stream = std::make_shared<gpu::BufferStream>();
1228 1195
1229 details.verticesBuffer = verticesBuffer;1196 details.verticesBuffer = verticesBuffer;
1230 details.colorBuffer = colorBuffer;1197 details.colorBuffer = colorBuffer;
1231 details.indicesBuffer = indicesBuffer;
1232 1198
1233 details.streamFormat = streamFormat;1199 details.streamFormat = streamFormat;
1234 details.stream = stream;1200 details.stream = stream;
@@ -1243,8 +1209,9 @@ void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec3& minCorner, co · 8 unmodified lines
1243 float vertexBuffer[VERTICES * FLOATS_PER_VERTEX] = { 1209 float vertexBuffer[VERTICES * FLOATS_PER_VERTEX] = {
1244 minCorner.x, minCorner.y, minCorner.z,1210 minCorner.x, minCorner.y, minCorner.z,
1245 maxCorner.x, minCorner.y, minCorner.z,1211 maxCorner.x, minCorner.y, minCorner.z,
1246 maxCorner.x, maxCorner.y, maxCorner.z,1212 minCorner.x, maxCorner.y, maxCorner.z,
1247 minCorner.x, maxCorner.y, maxCorner.z };1213 maxCorner.x, maxCorner.y, maxCorner.z
1214 };
1248 1215
1249 const int NUM_COLOR_SCALARS_PER_QUAD = 4;1216 const int NUM_COLOR_SCALARS_PER_QUAD = 4;
1250 int compactColor = ((int(color.x * 255.0f) & 0xFF)) |1217 int compactColor = ((int(color.x * 255.0f) & 0xFF)) |
@@ -1253,24 +1220,13 @@ void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec3& minCorner, co · 2 unmodified lines
1253 ((int(color.w * 255.0f) & 0xFF) << 24);1220 ((int(color.w * 255.0f) & 0xFF) << 24);
1254 int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor };1221 int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor };
1255 1222
1256 // Sam's recommended triangle slices
1257 // Triangle tri1 = { v0, v1, v3 };
1258 // Triangle tri2 = { v1, v2, v3 };
1259 // NOTE: Random guy on the internet's recommended triangle slices
1260 // Triangle tri1 = { v0, v1, v2 };
1261 // Triangle tri2 = { v2, v3, v0 };
1262
1263 quint16 indices[NUMBER_OF_INDICES] = { 0, 1, 3, 1, 2, 3 };
1264
1265 details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Byte*) vertexBuffer);1223 details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Byte*) vertexBuffer);
1266 details.colorBuffer->append(sizeof(colors), (gpu::Byte*) colors);1224 details.colorBuffer->append(sizeof(colors), (gpu::Byte*) colors);
1267 details.indicesBuffer->append(sizeof(indices), (gpu::Byte*) indices);
1268 }1225 }
1269 1226
1270 batch.setInputFormat(details.streamFormat);1227 batch.setInputFormat(details.streamFormat);
1271 batch.setInputStream(0, *details.stream);1228 batch.setInputStream(0, *details.stream);
1272 batch.setIndexBuffer(gpu::UINT16, details.indicesBuffer, 0);1229 batch.draw(gpu::TRIANGLE_STRIP, 4, 0);
1273 batch.drawIndexed(gpu::TRIANGLES, NUMBER_OF_INDICES, 0);
1274}1230}
1275 1231
1276void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec3& topLeft, const glm::vec3& bottomLeft, 1232void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec3& topLeft, const glm::vec3& bottomLeft,
@@ -1315,7 +1271,6 @@ void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec3& topLeft, cons · 38 unmodified lines
1315 }1271 }
1316 1272
1317 const int FLOATS_PER_VERTEX = 3 + 2; // 3d vertices + text coords1273 const int FLOATS_PER_VERTEX = 3 + 2; // 3d vertices + text coords
1318 const int NUMBER_OF_INDICES = 6; // 1 quad = 2 triangles
1319 const int VERTICES = 4; // 1 quad = 4 vertices1274 const int VERTICES = 4; // 1 quad = 4 vertices
1320 const int NUM_POS_COORDS = 3;1275 const int NUM_POS_COORDS = 3;
1321 const int VERTEX_TEXCOORD_OFFSET = NUM_POS_COORDS * sizeof(float);1276 const int VERTEX_TEXCOORD_OFFSET = NUM_POS_COORDS * sizeof(float);
@@ -1324,20 +1279,15 @@ void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec3& topLeft, cons · 2 unmodified lines
1324 1279
1325 details.isCreated = true;1280 details.isCreated = true;
1326 details.vertices = VERTICES;1281 details.vertices = VERTICES;
1327 details.indices = NUMBER_OF_INDICES;
1328 details.vertexSize = FLOATS_PER_VERTEX; // NOTE: this isn't used for BatchItemDetails maybe we can get rid of it1282 details.vertexSize = FLOATS_PER_VERTEX; // NOTE: this isn't used for BatchItemDetails maybe we can get rid of it
1329 1283
1330 auto verticesBuffer = std::make_shared<gpu::Buffer>();1284 auto verticesBuffer = std::make_shared<gpu::Buffer>();
1331 auto colorBuffer = std::make_shared<gpu::Buffer>();1285 auto colorBuffer = std::make_shared<gpu::Buffer>();
1332 auto indicesBuffer = std::make_shared<gpu::Buffer>();
1333
1334 auto streamFormat = std::make_shared<gpu::Stream::Format>();1286 auto streamFormat = std::make_shared<gpu::Stream::Format>();
1335 auto stream = std::make_shared<gpu::BufferStream>();1287 auto stream = std::make_shared<gpu::BufferStream>();
1336 1288
1337 details.verticesBuffer = verticesBuffer;1289 details.verticesBuffer = verticesBuffer;
1338 details.colorBuffer = colorBuffer;1290 details.colorBuffer = colorBuffer;
1339 details.indicesBuffer = indicesBuffer;
1340
1341 details.streamFormat = streamFormat;1291 details.streamFormat = streamFormat;
1342 details.stream = stream;1292 details.stream = stream;
1343 1293
@@ -1350,9 +1300,9 @@ void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec3& topLeft, cons · 6 unmodified lines
1350 1300
1351 1301
1352 float vertexBuffer[VERTICES * FLOATS_PER_VERTEX] = {1302 float vertexBuffer[VERTICES * FLOATS_PER_VERTEX] = {
1353 topLeft.x, topLeft.y, topLeft.z, texCoordTopLeft.x, texCoordTopLeft.y,
1354 bottomLeft.x, bottomLeft.y, bottomLeft.z, texCoordBottomLeft.x, texCoordBottomLeft.y,1303 bottomLeft.x, bottomLeft.y, bottomLeft.z, texCoordBottomLeft.x, texCoordBottomLeft.y,
1355 bottomRight.x, bottomRight.y, bottomRight.z, texCoordBottomRight.x, texCoordBottomRight.y,1304 bottomRight.x, bottomRight.y, bottomRight.z, texCoordBottomRight.x, texCoordBottomRight.y,
1305 topLeft.x, topLeft.y, topLeft.z, texCoordTopLeft.x, texCoordTopLeft.y,
1356 topRight.x, topRight.y, topRight.z, texCoordTopRight.x, texCoordTopRight.y,1306 topRight.x, topRight.y, topRight.z, texCoordTopRight.x, texCoordTopRight.y,
1357 };1307 };
1358 1308
@@ -1363,24 +1313,13 @@ void GeometryCache::renderQuad(gpu::Batch& batch, const glm::vec3& topLeft, cons · 4 unmodified lines
1363 ((int(color.w * 255.0f) & 0xFF) << 24);1313 ((int(color.w * 255.0f) & 0xFF) << 24);
1364 int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor };1314 int colors[NUM_COLOR_SCALARS_PER_QUAD] = { compactColor, compactColor, compactColor, compactColor };
1365 1315
1366 // Sam's recommended triangle slices
1367 // Triangle tri1 = { v0, v1, v3 };
1368 // Triangle tri2 = { v1, v2, v3 };
1369 // NOTE: Random guy on the internet's recommended triangle slices
1370 // Triangle tri1 = { v0, v1, v2 };
1371 // Triangle tri2 = { v2, v3, v0 };
1372
1373 quint16 indices[NUMBER_OF_INDICES] = { 0, 1, 3, 1, 2, 3 };
1374
1375 details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Byte*) vertexBuffer);1316 details.verticesBuffer->append(sizeof(vertexBuffer), (gpu::Byte*) vertexBuffer);
1376 details.colorBuffer->append(sizeof(colors), (gpu::Byte*) colors);1317 details.colorBuffer->append(sizeof(colors), (gpu::Byte*) colors);
1377 details.indicesBuffer->append(sizeof(indices), (gpu::Byte*) indices);
1378 }1318 }
1379 1319
1380 batch.setInputFormat(details.streamFormat);1320 batch.setInputFormat(details.streamFormat);
1381 batch.setInputStream(0, *details.stream);1321 batch.setInputStream(0, *details.stream);
1382 batch.setIndexBuffer(gpu::UINT16, details.indicesBuffer, 0);1322 batch.draw(gpu::TRIANGLE_STRIP, 4, 0);
1383 batch.drawIndexed(gpu::TRIANGLES, NUMBER_OF_INDICES, 0);
1384}1323}
1385 1324
1386void GeometryCache::renderDashedLine(gpu::Batch& batch, const glm::vec3& start, const glm::vec3& end, const glm::vec4& color, int id) {1325void GeometryCache::renderDashedLine(gpu::Batch& batch, const glm::vec3& start, const glm::vec3& end, const glm::vec4& color, int id) {