void Entity::transformAndRender() { if(!renderer || !enabled) return; if(matrixDirty) { rebuildTransformMatrix(); } if(depthOnly) { renderer->drawToColorBuffer(false); } bool isScissorEnabled; Polycode::Rectangle oldScissorBox; if(enableScissor) { isScissorEnabled = renderer->isScissorEnabled(); oldScissorBox = renderer->getScissorBox(); renderer->enableScissor(true); Rectangle finalScissorBox = scissorBox; // make sure that our scissor box is constrained to the parent one if it exists if(isScissorEnabled) { finalScissorBox = finalScissorBox.Clipped(renderer->getScissorBox()); } renderer->setScissorBox(finalScissorBox); } renderer->pushMatrix(); if(ignoreParentMatrix && parentEntity) { renderer->multModelviewMatrix(parentEntity->getConcatenatedMatrix().Inverse()); } renderer->multModelviewMatrix(transformMatrix); if(billboardMode) { if(billboardIgnoreScale) { renderer->billboardMatrix(); } else { renderer->billboardMatrixWithScale(getCompoundScale()); } if(billboardRoll) { renderer->multModelviewMatrix(getConcatenatedRollMatrix()); } } if(!depthWrite) renderer->enableDepthWrite(false); else renderer->enableDepthWrite(true); if(!depthTest) renderer->enableDepthTest(false); else renderer->enableDepthTest(true); renderer->pushVertexColor(); renderer->multiplyVertexColor(color); renderer->setBlendingMode(blendingMode); if(visible && rendererVis) { renderer->pushMatrix(); renderer->translate3D(-anchorPoint.x * bBox.x * 0.5, -anchorPoint.y * bBox.y * 0.5 * yAdjust, -anchorPoint.z * bBox.z * 0.5); Render(); renderer->popMatrix(); } if(!colorAffectsChildren) { renderer->pushVertexColor(); renderer->loadVertexColorIdentity(); if(visible || (!visible && !visibilityAffectsChildren)) { renderChildren(); } renderer->popVertexColor(); } else { if(visible || (!visible && !visibilityAffectsChildren)) { renderChildren(); } } renderer->popVertexColor(); renderer->popMatrix(); if(!depthWrite) renderer->enableDepthWrite(true); if(depthOnly) { renderer->drawToColorBuffer(true); } if(enableScissor) { renderer->enableScissor(isScissorEnabled); renderer->setScissorBox(oldScissorBox); } }