void STKMeshSceneNode::setFirstTimeMaterial() { if (isMaterialInitialized) return; irr::video::IVideoDriver* driver = irr_driver->getVideoDriver(); for (u32 i = 0; i<Mesh->getMeshBufferCount(); ++i) { scene::IMeshBuffer* mb = Mesh->getMeshBuffer(i); if (!mb) continue; video::E_MATERIAL_TYPE type = mb->getMaterial().MaterialType; video::IMaterialRenderer* rnd = driver->getMaterialRenderer(type); if (!isObject(type)) { #ifdef DEBUG Log::warn("material", "Unhandled (static) material type : %d", type); #endif continue; } GLMesh &mesh = GLmeshes[i]; if (rnd->isTransparent()) { TransparentMaterial TranspMat = MaterialTypeToTransparentMaterial(type); initvaostate(mesh, TranspMat); TransparentMesh[TranspMat].push_back(&mesh); } else { GeometricMaterial GeometricType = MaterialTypeToGeometricMaterial(type); ShadedMaterial ShadedType = MaterialTypeToShadedMaterial(type, mesh.textures); initvaostate(mesh, GeometricType, ShadedType); GeometricMesh[GeometricType].push_back(&mesh); ShadedMesh[ShadedType].push_back(&mesh); } } isMaterialInitialized = true; }
void STKMeshSceneNode::render() { irr::video::IVideoDriver* driver = irr_driver->getVideoDriver(); if (!Mesh || !driver) return; bool isTransparentPass = SceneManager->getSceneNodeRenderPass() == scene::ESNRP_TRANSPARENT; ++PassCount; driver->setTransform(video::ETS_WORLD, AbsoluteTransformation); Box = Mesh->getBoundingBox(); for (u32 i = 0; i<Mesh->getMeshBufferCount(); ++i) { scene::IMeshBuffer* mb = Mesh->getMeshBuffer(i); if (mb) { TextureMatrix = getMaterial(i).getTextureMatrix(0); const video::SMaterial& material = ReadOnlyMaterials ? mb->getMaterial() : Materials[i]; video::IMaterialRenderer* rnd = driver->getMaterialRenderer(material.MaterialType); bool transparent = (rnd && rnd->isTransparent()); if (isTransparentPass != transparent) continue; if (irr_driver->getPhase() == DISPLACEMENT_PASS) { initvaostate(GLmeshes[i], material.MaterialType); drawDisplace(GLmeshes[i]); continue; } if (!isObject(material.MaterialType)) { #ifdef DEBUG Log::warn("material", "Unhandled (static) material type : %d", material.MaterialType); #endif continue; } // only render transparent buffer if this is the transparent render pass // and solid only in solid pass if (irr_driver->getPhase() == GLOW_PASS) { initvaostate(GLmeshes[i], material.MaterialType); drawGlow(GLmeshes[i]); } else if (irr_driver->getPhase() == SHADOW_PASS) { initvaostate(GLmeshes[i], material.MaterialType); drawShadow(GLmeshes[i], material.MaterialType); } else { irr_driver->IncreaseObjectCount(); initvaostate(GLmeshes[i], material.MaterialType); if (transparent) drawTransparent(GLmeshes[i], material.MaterialType); else drawSolid(GLmeshes[i], material.MaterialType); } } } }