History

Remove the renderPart call from model.cpp and put the code path in the MeshPartPayload::render()

samcake committed 11 years ago

Commit 59afbf11 parent fc7f0c73 files · +126 −147Browse files

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

Unified · Split

libraries/render-utils/src/Model.cpp+0−141
@@ -1140,147 +1140,6 @@ AABox Model::getPartBounds(int meshIndex, int partIndex) { · 1139 unmodified lines
1140 return AABox();1140 return AABox();
1141}1141}
1142 1142
1143void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, int shapeID, const MeshPartPayload* payload) {
1144// PROFILE_RANGE(__FUNCTION__);
1145 PerformanceTimer perfTimer("Model::renderPart");
1146 if (!_readyWhenAdded) {
1147 return; // bail asap
1148 }
1149
1150 auto textureCache = DependencyManager::get<TextureCache>();
1151
1152 gpu::Batch& batch = *(args->_batch);
1153 auto mode = args->_renderMode;
1154
1155 auto alphaThreshold = args->_alphaThreshold; //translucent ? TRANSPARENT_ALPHA_THRESHOLD : OPAQUE_ALPHA_THRESHOLD; // FIX ME
1156
1157 const FBXGeometry& geometry = _geometry->getFBXGeometry();
1158 const std::vector<std::unique_ptr<NetworkMesh>>& networkMeshes = _geometry->getMeshes();
1159
1160 auto networkMaterial = _geometry->getShapeMaterial(shapeID);
1161 if (!networkMaterial) {
1162 return;
1163 };
1164 auto material = networkMaterial->_material;
1165 if (!material) {
1166 return;
1167 }
1168
1169 // TODO: Not yet
1170 // auto drawMesh = _geometry->getShapeMesh(shapeID);
1171 // auto drawPart = _geometry->getShapePart(shapeID);
1172
1173 // guard against partially loaded meshes
1174 if (meshIndex >= (int)networkMeshes.size() || meshIndex >= (int)geometry.meshes.size() || meshIndex >= (int)_meshStates.size() ) {
1175 return;
1176 }
1177
1178 updateClusterMatrices();
1179
1180 const NetworkMesh& networkMesh = *(networkMeshes.at(meshIndex).get());
1181 const FBXMesh& mesh = geometry.meshes.at(meshIndex);
1182 const MeshState& state = _meshStates.at(meshIndex);
1183
1184 // if our index is ever out of range for either meshes or networkMeshes, then skip it, and set our _meshGroupsKnown
1185 // to false to rebuild out mesh groups.
1186 if (meshIndex < 0 || meshIndex >= (int)networkMeshes.size() || meshIndex > geometry.meshes.size()) {
1187 _meshGroupsKnown = false; // regenerate these lists next time around.
1188 _readyWhenAdded = false; // in case any of our users are using scenes
1189 invalidCalculatedMeshBoxes(); // if we have to reload, we need to assume our mesh boxes are all invalid
1190 return; // FIXME!
1191 }
1192
1193
1194 int vertexCount = mesh.vertices.size();
1195 if (vertexCount == 0) {
1196 // sanity check
1197 return; // FIXME!
1198 }
1199
1200 auto drawMaterialKey = material->getKey();
1201 bool translucentMesh = drawMaterialKey.isTransparent() || drawMaterialKey.isTransparentMap();
1202
1203 bool hasTangents = drawMaterialKey.isNormalMap() && !mesh.tangents.isEmpty();
1204 bool hasSpecular = drawMaterialKey.isGlossMap(); // !drawMaterial->specularTextureName.isEmpty(); //mesh.hasSpecularTexture();
1205 bool hasLightmap = drawMaterialKey.isLightmapMap(); // !drawMaterial->emissiveTextureName.isEmpty(); //mesh.hasEmissiveTexture();
1206 bool isSkinned = state.clusterMatrices.size() > 1;
1207 bool wireframe = isWireframe();
1208
1209 // render the part bounding box
1210 #ifdef DEBUG_BOUNDING_PARTS
1211 {
1212 AABox partBounds = getPartBounds(meshIndex, partIndex);
1213 bool inView = args->_viewFrustum->boxInFrustum(partBounds) != ViewFrustum::OUTSIDE;
1214
1215 glm::vec4 cubeColor;
1216 if (isSkinned) {
1217 cubeColor = glm::vec4(0.0f, 1.0f, 1.0f, 1.0f);
1218 } else if (inView) {
1219 cubeColor = glm::vec4(1.0f, 0.0f, 1.0f, 1.0f);
1220 } else {
1221 cubeColor = glm::vec4(1.0f, 1.0f, 0.0f, 1.0f);
1222 }
1223
1224 Transform transform;
1225 transform.setTranslation(partBounds.calcCenter());
1226 transform.setScale(partBounds.getDimensions());
1227 batch.setModelTransform(transform);
1228 DependencyManager::get<DeferredLightingEffect>()->renderWireCube(batch, 1.0f, cubeColor);
1229 }
1230 #endif //def DEBUG_BOUNDING_PARTS
1231
1232 if (wireframe) {
1233 translucentMesh = hasTangents = hasSpecular = hasLightmap = isSkinned = false;
1234 }
1235
1236 ModelRender::Locations* locations = nullptr;
1237 ModelRender::pickPrograms(batch, mode, translucentMesh, alphaThreshold, hasLightmap, hasTangents, hasSpecular, isSkinned, wireframe,
1238 args, locations);
1239
1240
1241 payload->bindTransform(batch, locations);
1242
1243 payload->bindMesh(batch);
1244
1245 // guard against partially loaded meshes
1246 if (partIndex >= mesh.parts.size()) {
1247 return;
1248 }
1249
1250
1251 #ifdef WANT_DEBUG
1252 if (material == nullptr) {
1253 qCDebug(renderutils) << "WARNING: material == nullptr!!!";
1254 }
1255 #endif
1256
1257 {
1258 // apply material properties
1259 payload->bindMaterial(batch, locations);
1260
1261
1262 // TODO: We should be able to do that just in the renderTransparentJob
1263 if (translucentMesh && locations->lightBufferUnit >= 0) {
1264 PerformanceTimer perfTimer("DLE->setupTransparent()");
1265
1266 DependencyManager::get<DeferredLightingEffect>()->setupTransparent(args, locations->lightBufferUnit);
1267 }
1268 if (args) {
1269 args->_details._materialSwitches++;
1270 }
1271 }
1272
1273 {
1274 PerformanceTimer perfTimer("batch.drawIndexed()");
1275 payload->drawCall(batch);
1276 }
1277
1278 if (args) {
1279 const int INDICES_PER_TRIANGLE = 3;
1280 args->_details._trianglesRendered += payload->_drawPart._numIndices / INDICES_PER_TRIANGLE;
1281 }
1282}
1283
1284void Model::segregateMeshGroups() {1143void Model::segregateMeshGroups() {
1285 const FBXGeometry& geometry = _geometry->getFBXGeometry();1144 const FBXGeometry& geometry = _geometry->getFBXGeometry();
1286 const std::vector<std::unique_ptr<NetworkMesh>>& networkMeshes = _geometry->getMeshes();1145 const std::vector<std::unique_ptr<NetworkMesh>>& networkMeshes = _geometry->getMeshes();