|
|
@@ -20,7 +20,8 @@ Renderer::Renderer():
|
|
|
pps(*this),
|
|
|
bs(*this),
|
|
|
width(640),
|
|
|
- height(480)
|
|
|
+ height(480),
|
|
|
+ sceneDrawer(*this)
|
|
|
{}
|
|
|
|
|
|
|
|
|
@@ -92,278 +93,6 @@ void Renderer::drawQuad()
|
|
|
}
|
|
|
|
|
|
|
|
|
-//======================================================================================================================
|
|
|
-// setupShaderProg =
|
|
|
-//======================================================================================================================
|
|
|
-void Renderer::setupShaderProg(const Material& mtl, const ModelNode& modelNode, const Camera& cam) const
|
|
|
-{
|
|
|
- mtl.getShaderProg().bind();
|
|
|
- uint textureUnit = 0;
|
|
|
-
|
|
|
- //
|
|
|
- // FFP stuff
|
|
|
- //
|
|
|
- if(mtl.isBlendingEnabled())
|
|
|
- {
|
|
|
- glEnable(GL_BLEND);
|
|
|
- //glDisable(GL_BLEND);
|
|
|
- glBlendFunc(mtl.getBlendingSfactor(), mtl.getBlendingDfactor());
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- glDisable(GL_BLEND);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if(mtl.isDepthTestingEnabled())
|
|
|
- {
|
|
|
- glEnable(GL_DEPTH_TEST);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- glDisable(GL_DEPTH_TEST);
|
|
|
- }
|
|
|
-
|
|
|
- if(mtl.isWireframeEnabled())
|
|
|
- {
|
|
|
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //
|
|
|
- // calc needed matrices
|
|
|
- //
|
|
|
- Mat4 modelMat(modelNode.getWorldTransform());
|
|
|
- const Mat4& projectionMat = cam.getProjectionMatrix();
|
|
|
- const Mat4& viewMat = cam.getViewMatrix();
|
|
|
- Mat4 modelViewMat;
|
|
|
- Mat3 normalMat;
|
|
|
- Mat4 modelViewProjectionMat;
|
|
|
-
|
|
|
- // should I calculate the modelViewMat ?
|
|
|
- if(mtl.getStdUniVar(Material::SUV_MODELVIEW_MAT) ||
|
|
|
- mtl.getStdUniVar(Material::SUV_MODELVIEWPROJECTION_MAT) ||
|
|
|
- mtl.getStdUniVar(Material::SUV_NORMAL_MAT))
|
|
|
- {
|
|
|
- modelViewMat = Mat4::combineTransformations(viewMat, modelMat);
|
|
|
- }
|
|
|
-
|
|
|
- // set matrices
|
|
|
- if(mtl.getStdUniVar(Material::SUV_MODEL_MAT))
|
|
|
- {
|
|
|
- mtl.getStdUniVar(Material::SUV_MODEL_MAT)->setMat4(&modelMat);
|
|
|
- }
|
|
|
-
|
|
|
- if(mtl.getStdUniVar(Material::SUV_VIEW_MAT))
|
|
|
- {
|
|
|
- mtl.getStdUniVar(Material::SUV_VIEW_MAT)->setMat4(&viewMat);
|
|
|
- }
|
|
|
-
|
|
|
- if(mtl.getStdUniVar(Material::SUV_PROJECTION_MAT))
|
|
|
- {
|
|
|
- mtl.getStdUniVar(Material::SUV_PROJECTION_MAT)->setMat4(&projectionMat);
|
|
|
- }
|
|
|
-
|
|
|
- if(mtl.getStdUniVar(Material::SUV_MODELVIEW_MAT))
|
|
|
- {
|
|
|
- mtl.getStdUniVar(Material::SUV_MODELVIEW_MAT)->setMat4(&modelViewMat);
|
|
|
- }
|
|
|
-
|
|
|
- if(mtl.getStdUniVar(Material::SUV_VIEWPROJECTION_MAT))
|
|
|
- {
|
|
|
- mtl.getStdUniVar(Material::SUV_VIEWPROJECTION_MAT)->setMat4(&viewProjectionMat);
|
|
|
- }
|
|
|
-
|
|
|
- if(mtl.getStdUniVar(Material::SUV_NORMAL_MAT))
|
|
|
- {
|
|
|
- normalMat = modelViewMat.getRotationPart();
|
|
|
- mtl.getStdUniVar(Material::SUV_NORMAL_MAT)->setMat3(&normalMat);
|
|
|
- }
|
|
|
-
|
|
|
- if(mtl.getStdUniVar(Material::SUV_MODELVIEWPROJECTION_MAT))
|
|
|
- {
|
|
|
- modelViewProjectionMat = projectionMat * modelViewMat;
|
|
|
- mtl.getStdUniVar(Material::SUV_MODELVIEWPROJECTION_MAT)->setMat4(&modelViewProjectionMat);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //
|
|
|
- // FAis
|
|
|
- //
|
|
|
- if(mtl.getStdUniVar(Material::SUV_MS_NORMAL_FAI))
|
|
|
- {
|
|
|
- mtl.getStdUniVar(Material::SUV_MS_NORMAL_FAI)->setTexture(ms.getNormalFai(), textureUnit++);
|
|
|
- }
|
|
|
-
|
|
|
- if(mtl.getStdUniVar(Material::SUV_MS_DIFFUSE_FAI))
|
|
|
- {
|
|
|
- mtl.getStdUniVar(Material::SUV_MS_DIFFUSE_FAI)->setTexture(ms.getDiffuseFai(), textureUnit++);
|
|
|
- }
|
|
|
-
|
|
|
- if(mtl.getStdUniVar(Material::SUV_MS_SPECULAR_FAI))
|
|
|
- {
|
|
|
- mtl.getStdUniVar(Material::SUV_MS_SPECULAR_FAI)->setTexture(ms.getSpecularFai(), textureUnit++);
|
|
|
- }
|
|
|
-
|
|
|
- if(mtl.getStdUniVar(Material::SUV_MS_DEPTH_FAI))
|
|
|
- {
|
|
|
- mtl.getStdUniVar(Material::SUV_MS_DEPTH_FAI)->setTexture(ms.getDepthFai(), textureUnit++);
|
|
|
- }
|
|
|
-
|
|
|
- if(mtl.getStdUniVar(Material::SUV_IS_FAI))
|
|
|
- {
|
|
|
- mtl.getStdUniVar(Material::SUV_IS_FAI)->setTexture(is.getFai(), textureUnit++);
|
|
|
- }
|
|
|
-
|
|
|
- if(mtl.getStdUniVar(Material::SUV_PPS_PRE_PASS_FAI))
|
|
|
- {
|
|
|
- mtl.getStdUniVar(Material::SUV_PPS_PRE_PASS_FAI)->setTexture(pps.getPrePassFai(), textureUnit++);
|
|
|
- }
|
|
|
-
|
|
|
- if(mtl.getStdUniVar(Material::SUV_PPS_POST_PASS_FAI))
|
|
|
- {
|
|
|
- mtl.getStdUniVar(Material::SUV_PPS_POST_PASS_FAI)->setTexture(pps.getPostPassFai(), textureUnit++);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //
|
|
|
- // Other
|
|
|
- //
|
|
|
- if(mtl.getStdUniVar(Material::SUV_RENDERER_SIZE))
|
|
|
- {
|
|
|
- Vec2 v(width, height);
|
|
|
- mtl.getStdUniVar(Material::SUV_RENDERER_SIZE)->setVec2(&v);
|
|
|
- }
|
|
|
-
|
|
|
- if(mtl.getStdUniVar(Material::SUV_SCENE_AMBIENT_COLOR))
|
|
|
- {
|
|
|
- Vec3 col(SceneSingleton::getInstance().getAmbientCol());
|
|
|
- mtl.getStdUniVar(Material::SUV_SCENE_AMBIENT_COLOR)->setVec3(&col);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //
|
|
|
- // set user defined vars
|
|
|
- //
|
|
|
- boost::ptr_vector<MtlUserDefinedVar>::const_iterator it = mtl.getUserDefinedVars().begin();
|
|
|
- for(; it != mtl.getUserDefinedVars().end(); it++)
|
|
|
- {
|
|
|
- const MtlUserDefinedVar& udv = *it;
|
|
|
-
|
|
|
- switch(udv.getUniVar().getGlDataType())
|
|
|
- {
|
|
|
- // texture or FAI
|
|
|
- case GL_SAMPLER_2D:
|
|
|
- if(udv.getTexture() != NULL)
|
|
|
- {
|
|
|
- udv.getUniVar().setTexture(*udv.getTexture(), textureUnit);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- switch(udv.getFai())
|
|
|
- {
|
|
|
- case MtlUserDefinedVar::MS_DEPTH_FAI:
|
|
|
- udv.getUniVar().setTexture(ms.getDepthFai(), textureUnit);
|
|
|
- break;
|
|
|
- case MtlUserDefinedVar::IS_FAI:
|
|
|
- udv.getUniVar().setTexture(is.getFai(), textureUnit);
|
|
|
- break;
|
|
|
- case MtlUserDefinedVar::PPS_PRE_PASS_FAI:
|
|
|
- udv.getUniVar().setTexture(pps.getPrePassFai(), textureUnit);
|
|
|
- break;
|
|
|
- case MtlUserDefinedVar::PPS_POST_PASS_FAI:
|
|
|
- udv.getUniVar().setTexture(pps.getPostPassFai(), textureUnit);
|
|
|
- break;
|
|
|
- default:
|
|
|
- RASSERT_THROW_EXCEPTION("WTF?");
|
|
|
- }
|
|
|
- }
|
|
|
- ++textureUnit;
|
|
|
- break;
|
|
|
- // float
|
|
|
- case GL_FLOAT:
|
|
|
- udv.getUniVar().setFloat(udv.getFloat());
|
|
|
- break;
|
|
|
- // vec2
|
|
|
- case GL_FLOAT_VEC2:
|
|
|
- udv.getUniVar().setVec2(&udv.getVec2());
|
|
|
- break;
|
|
|
- // vec3
|
|
|
- case GL_FLOAT_VEC3:
|
|
|
- udv.getUniVar().setVec3(&udv.getVec3());
|
|
|
- break;
|
|
|
- // vec4
|
|
|
- case GL_FLOAT_VEC4:
|
|
|
- udv.getUniVar().setVec4(&udv.getVec4());
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- ON_GL_FAIL_THROW_EXCEPTION();
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-//======================================================================================================================
|
|
|
-// renderModelNode =
|
|
|
-//======================================================================================================================
|
|
|
-void Renderer::renderModelNode(const ModelNode& modelNode, const Camera& cam, ModelNodeRenderType type) const
|
|
|
-{
|
|
|
- boost::ptr_vector<ModelNodePatch>::const_iterator it = modelNode.getModelNodePatches().begin();
|
|
|
- for(; it != modelNode.getModelNodePatches().end(); it++)
|
|
|
- {
|
|
|
- const ModelNodePatch& modelNodePatch = *it;
|
|
|
-
|
|
|
- if((type == MNRT_MS && modelNodePatch.getCpMtl().renderInBlendingStage()) ||
|
|
|
- (type == MNRT_BS && !modelNodePatch.getCpMtl().renderInBlendingStage()) ||
|
|
|
- (type == MNRT_DP && modelNodePatch.getDpMtl().renderInBlendingStage()))
|
|
|
- {
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- const Material* mtl;
|
|
|
- const Vao* vao;
|
|
|
- if(type == MNRT_MS || type == MNRT_BS)
|
|
|
- {
|
|
|
- mtl = &modelNodePatch.getCpMtl();
|
|
|
- vao = &modelNodePatch.getCpVao();
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- mtl = &modelNodePatch.getDpMtl();
|
|
|
- vao = &modelNodePatch.getDpVao();
|
|
|
- }
|
|
|
-
|
|
|
- // Shader
|
|
|
- setupShaderProg(*mtl, modelNode, cam);
|
|
|
-
|
|
|
- vao->bind();
|
|
|
- glDrawElements(GL_TRIANGLES, modelNodePatch.getModelPatchRsrc().getMesh().getVertIdsNum(), GL_UNSIGNED_SHORT, 0);
|
|
|
- vao->unbind();
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-//======================================================================================================================
|
|
|
-// renderAllModelNodes =
|
|
|
-//======================================================================================================================
|
|
|
-void Renderer::renderAllModelNodes(const Camera& cam, ModelNodeRenderType type) const
|
|
|
-{
|
|
|
- Scene::Types<ModelNode>::ConstIterator it = SceneSingleton::getInstance().getModelNodes().begin();
|
|
|
- for(; it != SceneSingleton::getInstance().getModelNodes().end(); ++it)
|
|
|
- {
|
|
|
- const ModelNode& md = *(*it);
|
|
|
- renderModelNode(md, cam, type);
|
|
|
- }
|
|
|
-
|
|
|
- // the rendering above fucks the polygon mode
|
|
|
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
//======================================================================================================================
|
|
|
// unproject =
|
|
|
//======================================================================================================================
|