void GldpEntity::GatherRenderables(std::vector<GldpRenderable*>& list) { GldpRenderable* renderable = GetRenderable(); if(renderable) { list.push_back(GetRenderable()); } for(unsigned int i = 0; i < m_children.size(); ++i) { GldpEntity* child = m_children[i]; child->GatherRenderables(list); } }
STARTDECL(ph_setcolor) (Value &fixture_id, Value &color) { auto r = GetRenderable(fixture_id.ival); auto c = ValueDecTo<float4>(color); if (r) r->color = c; return Value(); }
STARTDECL(ph_setshader) (Value &fixture_id, Value &shader) { auto r = GetRenderable(fixture_id.ival); auto sh = LookupShader(shader.sval->str()); shader.DECRT(); if (r && sh) r->sh = sh; return Value(); }
void OcTree::GetVisibleRenderables(const Collidable &collider, SceneNodes &renderables) const { renderables.clear(); WalkScene(collider, [&](const SceneNode::Ptr &sceneNode) { auto render = sceneNode->GetComponent<MeshRender>(); if (render != nullptr && render->GetRenderable()) renderables.push_back(sceneNode); }); }
void OcTree::GetVisibleShadowCasters(const Collidable &collider, SceneNodes &renderables, bool clear) const { if (clear) renderables.clear(); WalkScene(collider, [&](const SceneNode::Ptr &sceneNode) { auto render = sceneNode->GetComponent<MeshRender>(); if (render != nullptr && render->GetRenderable() && render->GetMesh()->GetCastShadows()) renderables.push_back(sceneNode); }); }
void GldpEntity::Update(float deltaTime, const GldpTransformf& cameraInverseTransform, const GldpTransformf& accumulatedTransform) { m_worldTransform = accumulatedTransform * m_localTransform; GldpRenderable* renderable = GetRenderable(); if(renderable) { renderable->SetTransform(cameraInverseTransform * m_worldTransform); } for(unsigned int i = 0; i < m_children.size(); ++i) { GldpEntity* child = m_children[i]; child->Update(deltaTime, cameraInverseTransform, m_worldTransform); } }
void OcTree::GetVisibleRenderableAndLights(const Collidable &collider, SceneNodes &renderables, SceneNodes &lights, bool clear) const { if (clear) { renderables.clear(); lights.clear(); } WalkScene(collider, [&](const SceneNode::Ptr &sceneNode) { auto render = sceneNode->GetComponent<MeshRender>(); if (render != nullptr && render->GetRenderable()) renderables.push_back(sceneNode); else if (sceneNode->GetComponent<Light>() != nullptr) lights.push_back(sceneNode); }); }
void PrelightPipeline::DrawRenderable(const std::shared_ptr<Pass> &pass, const std::shared_ptr<SceneNode> &node) { auto render = node->GetComponent<MeshRender>(); if (render == nullptr || !render->GetRenderable()) return; auto mesh = render->GetMesh(); auto material = render->GetMaterial(); auto shader = material->GetShaderForPass(pass->GetRenderIndex()); if (shader == nullptr) shader = pass->GetShader(material->GetShaderType()); if (shader == nullptr) { LOGW << "Failed to draw " << node->GetName() << ", data incomplete!"; return; } shader->Bind(); shader->BindCamera(m_CurrentCamera); shader->BindMatrix(Matrix4::WORLD_MATRIX, node->GetWorldMatrix()); shader->BindMesh(mesh); shader->BindMaterial(material); for (unsigned int i = 0; i < pass->GetTextureCount(true); i++) { auto ptr = pass->GetTextureAt(i, true); shader->BindTexture(ptr->GetName(), ptr); } glDrawElements(GL_TRIANGLES, mesh->Indices.Data.size(), GL_UNSIGNED_INT, 0); shader->UnBind(); m_DrawCall++; }
STARTDECL(ph_settexture) (Value &fixture_id, Value &tex_id, Value &tex_unit) { auto r = GetRenderable(fixture_id.ival); if (r) r->textures[GetSampler(tex_unit)] = tex_id.ival; return Value(); }