Esempio n. 1
0
void Projector::appendRenderables( RenderQueue& queue, const Transform* transform )
{
	if( !geometry ) return;

	const Transform* geotransform = geometry->getEntity()->getTransform().get();
	const Matrix4x3& absoluteTransform = geotransform->getAbsoluteTransform();
	
	const RenderablesVector& renderables = geometry->getRenderables();
	
	for( size_t i = 0; i < renderables.size(); i++ )
	{
		RenderBatch* renderable = renderables[i].get();
		if( !renderable ) continue;

		renderable->onPreRender.Bind(this, &Projector::onPreRender);

		RenderState state;
		state.renderable = renderable;
		state.material = material.Resolve();
		state.modelMatrix = absoluteTransform;
		state.priority = renderable->getRenderPriority() + 1;

		queue.pushBack(state);
	}
}
Esempio n. 2
0
void MipMapReplacer::EnumerateTexturesRecursive(Entity * entity, Set<Texture *> & textures)
{
    if(!entity)
        return;

    int32 childrenCount = entity->GetChildrenCount();
    for(int32 i = 0; i < childrenCount; i++)
        EnumerateTexturesRecursive(entity->GetChild(i), textures);

    RenderObject * ro = GetRenderObject(entity);
    if(ro)
    {
        int32 rbCount = ro->GetRenderBatchCount();
        for(int32 i = 0; i < rbCount; i++)
        {
            RenderBatch * rb = ro->GetRenderBatch(i);
            if(rb)
            {
                DVASSERT(0 && "Vitaliy Borodovsky: Temporarly disabled. Need to rewrite for new materials");
                
                NMaterial * material = rb->GetMaterial();
                if(material)
                {
                    Texture * texture = material->GetTexture(NMaterial::TEXTURE_ALBEDO);
                    if(texture)
                        textures.insert(texture);
                }
            }
        }
    }
}
int32 NodesPropertyControl::GetTrianglesForLodLayer(LodComponent::LodData *lodData)
{
    int32 trianglesCount = 0;
    for(int32 n = 0; n < (int32)lodData->nodes.size(); ++n)
    {
        Vector<Entity *> meshes;
        lodData->nodes[n]->GetChildNodes(meshes);
        
        meshes.push_back(lodData->nodes[n]);
        
        for(int32 m = 0; m < (int32)meshes.size(); ++m)
        {
            RenderObject *ro = GetRenerObject(meshes[m]);
            if(!ro || ro->GetType() != RenderObject::TYPE_MESH) continue;

            uint32 count = ro->GetRenderBatchCount();
            for(uint32 r = 0; r < count; ++r)
            {
                RenderBatch *batch = ro->GetRenderBatch(r);
                
                PolygonGroup *pg = batch->GetPolygonGroup();
                if(pg)
                {
                    trianglesCount += pg->GetIndexCount() / 3;
                }
            }
        }
    }
    return trianglesCount;
}
Esempio n. 4
0
void RenderObject::Load(KeyedArchive * archive, SceneFileV2 *sceneFile)
{
    if(NULL != archive)
    {
        if(archive->IsKeyExists("ro.type")) type = archive->GetUInt32("ro.type");
        if(archive->IsKeyExists("ro.flags")) flags = archive->GetUInt32("ro.flags");
        if(archive->IsKeyExists("ro.debugflags")) debugFlags = archive->GetUInt32("ro.debugflags");

        if(archive->IsKeyExists("ro.batchCount"))
        {
            KeyedArchive *batchesArch = archive->GetArchive("ro.batches");
            for(uint32 i = 0; i < archive->GetUInt32("ro.batchCount"); ++i)
            {
                KeyedArchive *batchArch = batchesArch->GetArchive(KeyedArchive::GenKeyFromIndex(i));
                if(NULL != batchArch)
                {
                    RenderBatch *batch = (RenderBatch *) ObjectFactory::Instance()->New(batchArch->GetString("rb.classname"));
                    if(NULL != batch)
                    {
                        batch->Load(batchArch, sceneFile);
                        AddRenderBatch(batch);
                        batch->Release();
                    }
                }
            }
        }
    }

    AnimatedObject::Load(archive);
}
	RenderObject* SkyboxRenderObject::Clone(RenderObject *newObject)
	{
		if(!newObject)
		{
			DVASSERT_MSG(IsPointerToExactClass<SkyboxRenderObject>(this), "Can clone only SkyboxRenderObject");
			newObject = new SkyboxRenderObject();
		}
		
		SkyboxRenderObject* skyboxRenderObject = static_cast<SkyboxRenderObject*>(newObject);
		
		skyboxRenderObject->type = type;
		skyboxRenderObject->flags = flags;
		skyboxRenderObject->RemoveFlag(RenderObject::TREE_NODE_NEED_UPDATE);
		skyboxRenderObject->debugFlags = debugFlags;
		skyboxRenderObject->ownerDebugInfo = ownerDebugInfo;
		
		skyboxRenderObject->bbox = bbox;
		skyboxRenderObject->texturePath = texturePath;
		skyboxRenderObject->offsetZ = offsetZ;
		skyboxRenderObject->rotationZ = rotationZ;
		skyboxRenderObject->nonClippingDistance = nonClippingDistance;
		
		uint32 size = GetRenderBatchCount();
		for(uint32 i = 0; i < size; ++i)
		{
			RenderBatch *batch = GetRenderBatch(i)->Clone();
			skyboxRenderObject->AddRenderBatch(batch);
			batch->Release();
		}
		
		skyboxRenderObject->BuildSkybox();
		skyboxRenderObject->UpdateMaterial();
		
		return newObject;
	}
void MipMapReplacer::EnumerateTexturesRecursive(Entity * entity, Set<Texture *> & textures)
{
    if(!entity)
        return;

    int32 childrenCount = entity->GetChildrenCount();
    for(int32 i = 0; i < childrenCount; i++)
        EnumerateTexturesRecursive(entity->GetChild(i), textures);

    RenderObject * ro = GetRenderObject(entity);
    if(ro)
    {
        int32 rbCount = ro->GetRenderBatchCount();
        for(int32 i = 0; i < rbCount; i++)
        {
            RenderBatch * rb = ro->GetRenderBatch(i);
            if(rb)
            {
                Material * material = rb->GetMaterial();
                if(material)
                {
                    Texture * texture = material->GetTexture(Material::TEXTURE_DIFFUSE);
                    if(texture)
                        textures.insert(texture);
                }
            }
        }
    }
}
Esempio n. 7
0
RenderObject * RenderObject::Clone(RenderObject *newObject)
{
    if(!newObject)
    {
        DVASSERT_MSG(IsPointerToExactClass<RenderObject>(this), "Can clone only RenderObject");
        newObject = new RenderObject();
    }

    newObject->type = type;
    newObject->flags = flags;
    newObject->debugFlags = debugFlags;
    //ro->bbox = bbox;
    //ro->worldBBox = worldBBox;

    uint32 size = GetRenderBatchCount();
    for(uint32 i = 0; i < size; ++i)
    {
        RenderBatch *batch = GetRenderBatch(i)->Clone();
        newObject->AddRenderBatch(batch);
        batch->Release();
    }
    newObject->ownerDebugInfo = ownerDebugInfo;

    return newObject;
}
Esempio n. 8
0
void RenderObject::Save(KeyedArchive * archive, SceneFileV2* sceneFile)
{
    AnimatedObject::Save(archive);

    if(NULL != archive)
    {
        archive->SetUInt32("ro.type", type);
        archive->SetUInt32("ro.flags", flags);
        archive->SetUInt32("ro.debugflags", debugFlags);
        archive->SetUInt32("ro.batchCount", GetRenderBatchCount());

        KeyedArchive *batchesArch = new KeyedArchive();
        for(uint32 i = 0; i < GetRenderBatchCount(); ++i)
        {
            RenderBatch *batch = GetRenderBatch(i);
            if(NULL != batch)
            {
                KeyedArchive *batchArch = new KeyedArchive();
                batch->Save(batchArch, sceneFile);
                if(batchArch->Count() > 0)
                {
                    batchArch->SetString("rb.classname", batch->GetClassName());
                }
                batchesArch->SetArchive(KeyedArchive::GenKeyFromIndex(i), batchArch);
                batchArch->Release();
            }
        }

        archive->SetArchive("ro.batches", batchesArch);
        batchesArch->Release();
    }
}
Esempio n. 9
0
void MainForwardRenderPass::Draw(RenderSystem * renderSystem, uint32 clearBuffers)
{
    Camera *mainCamera = renderSystem->GetMainCamera();        
    Camera *drawCamera = renderSystem->GetDrawCamera();   
    DVASSERT(mainCamera);
    DVASSERT(drawCamera);
    drawCamera->SetupDynamicParameters();            
    if (mainCamera!=drawCamera)    
        mainCamera->PrepareDynamicParameters();

    if (needWaterPrepass)
    {
        /*water presence is cached from previous frame in optimization purpose*/
        /*if on previous frame there was water - reflection and refraction textures are rendered first (it helps to avoid excessive renderPassBatchArray->PrepareVisibilityArray)*/
        /* if there was no water on previous frame, and it appears on this frame - reflection and refractions textures are still to be rendered*/
        PrepareReflectionRefractionTextures(renderSystem);
    }
    
	//important: FoliageSystem also using main camera for cliping vegetation cells
    PrepareVisibilityArrays(mainCamera, renderSystem);
	
	RenderLayerBatchArray *waterLayer = renderPassBatchArray->Get(RenderLayerManager::Instance()->GetLayerIDByName(LAYER_WATER));
	
	uint32 waterBatchesCount = waterLayer->GetRenderBatchCount();	
	if (waterBatchesCount)
	{        
        waterBox.Empty();
		for (uint32 i=0; i<waterBatchesCount; ++i)
		{
			RenderBatch *batch = waterLayer->Get(i);						
			waterBox.AddAABBox(batch->GetRenderObject()->GetWorldBoundingBox());
			
		}
	}    
    
	if (!needWaterPrepass&&waterBatchesCount)
	{
        PrepareReflectionRefractionTextures(renderSystem); 
        /*as PrepareReflectionRefractionTextures builds render batches according to reflection/refraction camera - render batches in main pass list are not valid anymore*/
        /*to avoid this happening every frame water visibility is cached from previous frame (needWaterPrepass)*/
        /*however if there was no water on previous frame and there is water on this frame visibilityArray should be re-prepared*/
        renderPassBatchArray->Clear();
        renderPassBatchArray->PrepareVisibilityArray(&visibilityArray, mainCamera);
                
	}	
    needWaterPrepass = (waterBatchesCount!=0); //for next frame;

    ClearBuffers(clearBuffers);

	DrawLayers(mainCamera);   
}
Esempio n. 10
0
void BulletObject::CreateFromEntity()
{
	bool wasPolygonGroup = false;

	RenderObject * renderObject = ((RenderComponent*)entity->GetComponent(Component::RENDER_COMPONENT))->GetRenderObject();
	uint32 batchesCount = renderObject->GetRenderBatchCount();
	for(uint32 batchIndex = 0; batchIndex < batchesCount; ++batchIndex)
	{
		RenderBatch * batch = renderObject->GetRenderBatch(batchIndex);
		PolygonGroup * pg = batch->GetPolygonGroup();
		if(pg)
		{
			if(!wasPolygonGroup)
			{
				collisionObject = new btCollisionObject();
				trimesh = new btTriangleMesh();
				createdWith = entity->GetWorldTransform();
				wasPolygonGroup = true;
			}

			for(int32 i = 0; i < pg->indexCount / 3; i++)
			{
				uint16 index0 = pg->indexArray[i*3];
				uint16 index1 = pg->indexArray[i*3+1];
				uint16 index2 = pg->indexArray[i*3+2];
				Vector3 v;
				pg->GetCoord(index0, v);
				v = v * createdWith;
				btVector3 vertex0(v.x, v.y, v.z);
				pg->GetCoord(index1, v);
				v = v * createdWith;
				btVector3 vertex1(v.x, v.y, v.z);
				pg->GetCoord(index2, v);
				v = v * createdWith;
				btVector3 vertex2(v.x, v.y, v.z);

				trimesh->addTriangle(vertex0,vertex1,vertex2, false);
			}
		}
	}

	if(wasPolygonGroup)
	{
		shape = new btBvhTriangleMeshShape(trimesh, true, true);    
		collisionObject->setCollisionShape(shape);
		collWorld->addCollisionObject(collisionObject);
	}
}
Esempio n. 11
0
RenderBatch* Camera::renderBatch(int queue)
{
	for (int i = 0; i < m_renderBatches->count(); ++i)
	{
		RenderBatch* batch = (RenderBatch*)m_renderBatches->get(i);
		if (batch->renderQueue() == queue)
		{
			return batch;
		}
	}

	RenderBatch* batch = RenderBatch::create(this, queue);
	batch->autorelease();
	m_renderBatches->add(batch);
	return batch;
}
Esempio n. 12
0
RenderBatchPtr Model::createDebugRenderable() const
{
	MaterialHandle handleMaterial = MaterialCreate(AllocatorGetHeap(), "SkeletonDebug");

	Material* material = handleMaterial.Resolve();
	material->setDepthTest(false);

	GeometryBuffer* gb = AllocateHeap(GeometryBuffer);
	
	RenderBatch* renderable = AllocateHeap(Renderable);
	renderable->setPrimitiveType(PrimitiveType::Lines);
	renderable->setGeometryBuffer(gb);
	renderable->setMaterial(handleMaterial);

	return renderable;
}
Esempio n. 13
0
Projector::~Projector()
{
	if( !geometry ) return;

	const RenderablesVector& renderables = geometry->getRenderables();
	
	for( size_t i = 0; i < renderables.size(); i++ )
	{
		RenderBatch* renderable = renderables[i].get();
		renderable->onPreRender.clear();

		const UniformBufferPtr& ub = renderable->getUniformBuffer();
		ub->removeUniform("vp_TextureProjection");
		ub->removeUniform("vp_TextureView");
	}
}
Esempio n. 14
0
void Camera::present()
{
	// Viewport
	Rectf viewportRect;
	if (m_renderTexture)
	{
		glViewport(0, 0, m_renderTexture->width(), m_renderTexture->height());
		m_renderTexture->begin();

		viewportRect = Rectf(0, 0, m_renderTexture->width(), m_renderTexture->height());
	}
	else
	{
		glViewport((GLint)m_viewportRect.x(), (GLint)m_viewportRect.y(), (GLsizei)m_viewportRect.width(), (GLsizei)m_viewportRect.height());
		viewportRect = m_viewportRect;
	}

	// Prepare matrices
	if (m_isProjectionDirty)
	{
		if (m_projectType == Orthographic)
		{
			buildOrthographicProjectionMatrix(m_projection, viewportRect, m_orthoSize, m_zNear, m_zFar, m_renderTexture != NULL);
		}
		m_isProjectionDirty = false;
	}	
	m_worldviewprojection = m_projection * m_view;

	// Clear
	if (m_clearType != NONE)
	{
		glClearColor(m_backgroundColor.red, m_backgroundColor.green, m_backgroundColor.blue, m_backgroundColor.alpha);
		glClear(m_clearType);		
	}
	
	for (int i = 0; i < m_renderBatches->count(); ++i)
	{
		RenderBatch* batch = (RenderBatch*)m_renderBatches->get(i);
		batch->draw();
		batch->clear();
	}

	if (m_renderTexture)
	{
		m_renderTexture->end();
	}
}
Esempio n. 15
0
void TextureHelper::EnumerateTextures(DAVA::Entity *forNode, Map<String, Texture *> &textures)
{
	if(!forNode)  return;

	Vector<Entity *> nodes;
	forNode->GetChildNodes(nodes);

	nodes.push_back(forNode);

	for(int32 n = 0; n < (int32)nodes.size(); ++n)
	{
		RenderComponent *rc = static_cast<RenderComponent *>(nodes[n]->GetComponent(Component::RENDER_COMPONENT));
		if(!rc) continue;

		RenderObject *ro = rc->GetRenderObject();
		if(!ro) continue;

		uint32 count = ro->GetRenderBatchCount();
		for(uint32 b = 0; b < count; ++b)
		{
			RenderBatch *renderBatch = ro->GetRenderBatch(b);

			NMaterial *material = renderBatch->GetMaterial();
			if(material)
			{
				for(int32 t = 0; t < material->GetTextureCount(); ++t)
				{
					Texture* tx = material->GetTexture(t);
					CollectTexture(textures, tx->GetPathname(), tx);
				}
			}

			/*InstanceMaterialState *instanceMaterial = renderBatch->GetMaterialInstance();
			if(instanceMaterial)
			{
				CollectTexture(textures, instanceMaterial->GetLightmapName(), instanceMaterial->GetLightmap());
			}*/
		}

		Landscape *land = dynamic_cast<Landscape *>(ro);
		if(land)
		{
			CollectLandscapeTextures(textures, land);
		}
	}
}
Esempio n. 16
0
void SceneHelper::EnumerateDescriptors(DAVA::Entity *forNode, DAVA::Set<DAVA::FilePath> &descriptors)
{
	if(!forNode)  return;

	Vector<Entity *> nodes;
	forNode->GetChildNodes(nodes);

	nodes.push_back(forNode);

	for(int32 n = 0; n < (int32)nodes.size(); ++n)
	{
		RenderComponent *rc = static_cast<RenderComponent *>(nodes[n]->GetComponent(Component::RENDER_COMPONENT));
		if(!rc) continue;

		RenderObject *ro = rc->GetRenderObject();
		if(!ro) continue;

		uint32 count = ro->GetRenderBatchCount();
		for(uint32 b = 0; b < count; ++b)
		{
			RenderBatch *renderBatch = ro->GetRenderBatch(b);

			Material *material = renderBatch->GetMaterial();
			if(material)
			{
				for(int32 t = 0; t < Material::TEXTURE_COUNT; ++t)
				{
					CollectDescriptors(descriptors, material->GetTextureName((DAVA::Material::eTextureLevel)t));
				}
			}

			InstanceMaterialState *instanceMaterial = renderBatch->GetMaterialInstance();
			if(instanceMaterial)
			{
				CollectDescriptors(descriptors, instanceMaterial->GetLightmapName());
			}
		}

		Landscape *land = dynamic_cast<Landscape *>(ro);
		if(land)
		{
			CollectLandscapeDescriptors(descriptors, land);
		}
	}
}
Esempio n. 17
0
void SceneHelper::EnumerateTextures(Entity *forNode, Map<String, Texture *> &textures)
{
	if(!forNode) return;

	Vector<Entity *> nodes;
	forNode->GetChildNodes(nodes);

	nodes.push_back(forNode);

	for(int32 n = 0; n < (int32)nodes.size(); ++n)
	{
		RenderObject *ro = GetRenderObject(nodes[n]);
		if(!ro) continue;

		uint32 count = ro->GetRenderBatchCount();
		for(uint32 b = 0; b < count; ++b)
		{
			RenderBatch *renderBatch = ro->GetRenderBatch(b);

			Material *material = renderBatch->GetMaterial();
			if(material)
			{
				for(int32 t = 0; t < Material::TEXTURE_COUNT; ++t)
				{
					CollectTexture(textures, material->GetTextureName((DAVA::Material::eTextureLevel)t).GetAbsolutePathname(), material->GetTexture((DAVA::Material::eTextureLevel)t));
				}
			}

			InstanceMaterialState *instanceMaterial = renderBatch->GetMaterialInstance();
			if(instanceMaterial)
			{
				CollectTexture(textures, instanceMaterial->GetLightmapName().GetAbsolutePathname(), instanceMaterial->GetLightmap());
			}
		}

		Landscape *land = dynamic_cast<Landscape *>(ro);
		if(land)
		{
			CollectLandscapeTextures(textures, land);
		}
	}
}
bool DAEConvertWithSettingsAction::CopyRenderObjects( DAVA::RenderObject *srcRo, DAVA::RenderObject *dstRo )
{
	uint32 srcBatchCount = srcRo->GetRenderBatchCount();
	uint32 dstBatchCount = dstRo->GetRenderBatchCount();

	if(srcBatchCount != dstBatchCount)
	{
		return false;
	}

	for(uint32 i = 0; i < srcBatchCount; ++i)
	{
		RenderBatch *srcBatch = srcRo->GetRenderBatch(i);
		RenderBatch *dstBatch = dstRo->GetRenderBatch(i);

		dstBatch->SetPolygonGroup(srcBatch->GetPolygonGroup());
	}

	return true;
}
Esempio n. 19
0
void Mesh::AddPolygonGroup(PolygonGroup * polygonGroup, Material * material)
{
    RenderBatch * batch = new RenderBatch();
    batch->SetPolygonGroup(polygonGroup);
    batch->SetMaterial(material);
    batch->SetRenderDataObject(polygonGroup->renderDataObject);
    batch->SetStartIndex(0);
    batch->SetIndexCount(polygonGroup->GetIndexCount());
    AddRenderBatch(batch);
    
	batch->Release();
    //polygonGroups.push_back(polygonGroup);
}
Esempio n. 20
0
	void SkyboxSystem::Reload()
	{
		if(skyboxEntity)
		{
			RenderComponent* renderComponent = static_cast<RenderComponent*>(skyboxEntity->GetComponent(Component::RENDER_COMPONENT));
			SkyboxRenderObject* renderObj = cast_if_equal<SkyboxRenderObject*>(renderComponent->GetRenderObject());
			
			if(renderObj &&
			   renderObj->GetRenderBatchCount() > 0)
			{
				RenderBatch* renderBatch = renderObj->GetRenderBatch(0);
				Material* material = renderBatch->GetMaterial();
				
				if(material)
				{
					Texture* texture = material->GetTexture(Material::TEXTURE_DIFFUSE);
					if(texture)
					{
						texture->Reload();
					}
				}
			}
		}
	}
	void SkyboxRenderObject::CreateRenderData()
	{
		if(renderBatchArray.size() == 0)
		{
			RenderDataObject* renderDataObj = new RenderDataObject();
			
			Material* skyboxMaterial = new Material();
			skyboxMaterial->SetType(Material::MATERIAL_SKYBOX);
			skyboxMaterial->SetAlphablend(false);
			skyboxMaterial->SetName("SkyBox_material");
			skyboxMaterial->GetRenderState()->SetDepthFunc(CMP_LEQUAL);
			skyboxMaterial->GetRenderState()->state |= RenderState::STATE_DEPTH_TEST;
			skyboxMaterial->GetRenderState()->state &= ~RenderState::STATE_DEPTH_WRITE;
			
			RenderBatch* skyboxRenderBatch = new RenderBatch();
			skyboxRenderBatch->SetRenderDataObject(renderDataObj);
			skyboxRenderBatch->SetMaterial(skyboxMaterial);
			SafeRelease(renderDataObj);
			SafeRelease(skyboxMaterial);
			
			RenderObject::AddRenderBatch(skyboxRenderBatch);
			SafeRelease(skyboxRenderBatch);			
		}
	}
Esempio n. 22
0
void RenderLayer::Update(Camera * camera)
{
    // Need sort
    if ((flags & SORT_THIS_FRAME) == SORT_THIS_FRAME)
    {
        uint32 renderBatchCount = (uint32)renderBatchArray.size();
        sortArray.resize(renderBatchCount);
        if (flags & SORT_BY_MATERIAL)
        {
            for (uint32 k = 0; k < renderBatchCount; ++k)
            {
                RenderBatchSortItem & item = sortArray[k];
                RenderBatch * batch = renderBatchArray[k];;
                item.renderBatch = batch;
                item.sortingKey = ((pointer_size)renderBatchArray[k]->GetMaterial() & 0x0fffffff) | (batch->GetSortingKey() << 28);
            }
            
            std::stable_sort(sortArray.begin(), sortArray.end(), MaterialCompareFunction);
            
            for (uint32 k = 0; k < renderBatchCount; ++k)
            {
                RenderBatchSortItem & item = sortArray[k];
                renderBatchArray[k] = item.renderBatch;
                item.renderBatch->SetRemoveIndex(this, k);
            }
            flags &= ~SORT_REQUIRED;
        }
        
        if (flags & SORT_BY_DISTANCE)
        {
            Vector3 cameraPosition = camera->GetPosition();
            
            for (uint32 k = 0; k < renderBatchCount; ++k)
            {
                RenderBatchSortItem & item = sortArray[k];
                RenderBatch * batch = renderBatchArray[k];;
                item.renderBatch = batch;

                item.sortingKey = 0;
                if (batch)
                {
                    RenderObject * renderObject = batch->GetRenderObject();
                    Vector3 position = renderObject->GetBoundingBox().GetCenter();
                    float32 distance = (position - cameraPosition).Length();
                    
                    item.sortingKey = (((uint32)distance) & 0x0fffffff) | (batch->GetSortingKey() << 24);
                }
            }
            
            std::stable_sort(sortArray.begin(), sortArray.end(), MaterialCompareFunction);
            
            for (uint32 k = 0; k < renderBatchCount; ++k)
            {
                RenderBatchSortItem & item = sortArray[k];
                renderBatchArray[k] = item.renderBatch;
                item.renderBatch->SetRemoveIndex(this, k);
            }
            
            flags |= SORT_REQUIRED;
        }
    }
    
    
    
}
Esempio n. 23
0
void RenderDevice::render( const RenderState& state, const LightQueue& lights )
{
    BufferManager* buffers = activeContext->bufferManager;
    ProgramManager* programs = activeContext->programManager;
    
    RenderBatch* renderable = state.renderable;
    bindBuffers(renderable);

    const GeometryBuffer* gb = renderable->getGeometryBuffer().get();
    if( gb->data.Empty() ) return;

    BufferEntry* bufs = buffers->getBuffer(gb);

    // Setup the vertex buffer format.
    VertexBuffer* vb = bufs->vb.get();
    renderBackend->setupVertexBuffer(vb);
    
    Material* material = state.material;
    ShaderMaterial* shader = material->getShader().Resolve();

    ShaderProgram* shaderProgram = programs->getProgram(shader);
    if( !shaderProgram ) return;

    if( !shaderProgram->isLinked() && !shaderProgram->link() )
        return;

    shaderProgram->bind();

    renderBackend->setupRenderState(state, true);
    bindTextureUnits(state, true);

    if( !renderable->onPreRender.empty() )
    {
        // Call the user pre render hook.
        renderable->onPreRender(activeView, state);
    }

    RenderLayer stage = renderable->getRenderLayer();

    if( stage != RenderLayer::Overlays )
    {
        if( !setupRenderStateMatrix(state) )
            return;

        //if( !setupRenderStateLight(state, lights) )
        //  return;
    }
    else if( stage == RenderLayer::Overlays )
    {
        if( !setupRenderStateOverlay(state) )
            return;
    }

    UniformBuffer* ub = renderable->getUniformBuffer().get();
    shaderProgram->setUniforms(ub);

    renderBackend->renderBatch(renderable);
    
    if( !renderable->onPostRender.empty() )
    {
        // Call the user post render hook.
        renderable->onPostRender(activeView, state);
    }
    
    renderBackend->unsetupRenderState(state);
    unbindTextureUnits(state.material);
    
    shaderProgram->unbind();

    renderBackend->unbindVertexBuffer(vb);
    unbindBuffers(renderable);
}
Esempio n. 24
0
void GUIButton::AddToBatch(RenderBatch& batch, GUI* caller) {
	batch.Add(mButtonBottom);
	batch.Add(mButtonTop);
	batch.Add(mButtonText);
}
bool SwitchToRenerObjectConverter::MergeSwitch(Entity * entity)
{
    Vector<Entity*> entitiesToRemove;

    SwitchComponent * sw = GetSwitchComponent(entity);
    if(sw)
    {
        RenderComponent * rc = GetRenderComponent(entity);
        RenderObject * ro = 0;
        if(!rc)
        {
            ro = new Mesh();
            rc = new RenderComponent(ro);
            ro->Release();

            ro->SetAABBox(AABBox3(Vector3(0, 0, 0), Vector3(0, 0, 0)));
            entity->AddComponent(rc);
        }
        else
        {
            ro = rc->GetRenderObject();
        }

        DVASSERT(ro);

        int32 size = entity->GetChildrenCount();
        for(int32 i = 0; i < size; ++i)
        {
            Entity * sourceEntity = entity->GetChild(i);
            RenderObject * sourceRenderObject = GetRenderObject(sourceEntity);

            //workaround for custom properties for crashed model
            if(1 == i) // crash model
            {
                KeyedArchive *childProps = GetCustomPropertiesArchieve(sourceEntity);
                if(childProps && childProps->IsKeyExists("CollisionType"))
                {
                    KeyedArchive *entityProps = GetOrCreateCustomProperties(entity)->GetArchive();
                    entityProps->SetInt32("CollisionTypeCrashed", childProps->GetInt32("CollisionType", 0));
                }
            }
            //end of custom properties

            Vector<std::pair<Entity*, RenderObject*> > renderPairs;
            if(sourceRenderObject)
            {
                renderPairs.push_back(std::make_pair(sourceEntity, sourceRenderObject));
            }
            else
            {
                FindRenderObjectsRecursive(sourceEntity, renderPairs);
                DVASSERT(renderPairs.size() == 1);
                sourceRenderObject = renderPairs[0].second;
            }

            if(sourceRenderObject)
            {
                TransformComponent * sourceTransform = GetTransformComponent(sourceEntity);
                if (sourceTransform->GetLocalTransform() != Matrix4::IDENTITY)
                {
                    PolygonGroup * pg = sourceRenderObject->GetRenderBatchCount() > 0 ? sourceRenderObject->GetRenderBatch(0)->GetPolygonGroup() : 0;
                    if(pg && bakedPolygonGroups.end() == bakedPolygonGroups.find(pg))
                    {
                        sourceRenderObject->BakeGeometry(sourceTransform->GetLocalTransform());
                        bakedPolygonGroups.insert(pg);
                    }
                }

                uint32 sourceSize = sourceRenderObject->GetRenderBatchCount();
                while(sourceSize)
                {
                    int32 lodIndex, switchIndex;
                    RenderBatch * sourceRenderBatch = sourceRenderObject->GetRenderBatch(0, lodIndex, switchIndex);
                    sourceRenderBatch->Retain();
                    sourceRenderObject->RemoveRenderBatch(sourceRenderBatch);
                    ro->AddRenderBatch(sourceRenderBatch, lodIndex, i);
                    sourceRenderBatch->Release();
                    sourceSize--;
                }
            }

            renderPairs[0].first->RemoveComponent(Component::RENDER_COMPONENT);

            LodComponent * lc = GetLodComponent(sourceEntity);
            if((0 != lc) && (0 == GetLodComponent(entity)))
            {
                LodComponent * newLod = (LodComponent*)lc->Clone(entity);
                entity->AddComponent(newLod);
            }

            renderPairs[0].first->RemoveComponent(Component::LOD_COMPONENT);

            if(sourceEntity->GetChildrenCount() == 0)
            {
                entitiesToRemove.push_back(sourceEntity);
            }
        }
    }

    uint32 entitiesToRemoveCount = entitiesToRemove.size();
    for(uint32 i = 0; i < entitiesToRemoveCount; ++i)
    {
        entitiesToRemove[i]->GetParent()->RemoveNode(entitiesToRemove[i]);
    }

    return false;
}
Esempio n. 26
0
void RenderLayer::Draw(const FastName & ownerRenderPass, Camera * camera, RenderLayerBatchArray * renderLayerBatchArray)
{
    TIME_PROFILE("RenderLayer::Draw");
    
    renderLayerBatchArray->Sort(camera);
    
#if CAN_INSTANCE_CHECK
    RenderBatch * prevBatch = 0;
    uint32 canBeInstanced = 0;
    
    Vector<int32> chain;
#endif
    uint32 size = (uint32)renderLayerBatchArray->GetRenderBatchCount();
    
    RenderOptions* options = RenderManager::Instance()->GetOptions();
    bool layerOcclustionStatsEnabled = options->IsOptionEnabled(RenderOptions::LAYER_OCCLUSION_STATS);
    
    if(layerOcclustionStatsEnabled)
    {
        if(NULL == occlusionQuery)
        {
            occlusionQuery = new OcclusionQuery();
            occlusionQuery->Init();
        }
    
        if(false == queryPending)
        {
            occlusionQuery->BeginQuery();
        }
    }
    
    for (uint32 k = 0; k < size; ++k)
    {
        RenderBatch * batch = renderLayerBatchArray->Get(k);

#if CAN_INSTANCE_CHECK
        if (prevBatch && batch->GetPolygonGroup() == prevBatch->GetPolygonGroup() && batch->GetMaterial()->GetParent() == prevBatch->GetMaterial()->GetParent())
        {
            canBeInstanced++;
        }else
        {
            if (canBeInstanced > 0)
                chain.push_back(canBeInstanced + 1);
            canBeInstanced = 0;
        }
#endif
        batch->Draw(ownerRenderPass, camera);
#if CAN_INSTANCE_CHECK
        prevBatch = batch;
#endif
    }
    
    if(layerOcclustionStatsEnabled)
    {
        if(false == queryPending)
        {
            occlusionQuery->EndQuery();
            queryPending = true;
        }
        
        if((true == queryPending) &&
           occlusionQuery->IsResultAvailable())
        {
            occlusionQuery->GetQuery(&lastFragmentsRenderedValue);
            queryPending = false;
        }
    }
    
#if CAN_INSTANCE_CHECK
    int32 realDrawEconomy = 0;
    for (uint32 k = 0; k < chain.size(); ++k)
    {
        realDrawEconomy += (chain[k] - 1);
    }
    
    Logger::Debug("Pass: %s Layer: %s Size: %d Can be instanced: %d Econ: %d", ownerRenderPass.c_str(), name.c_str(), size, chain.size(), realDrawEconomy);
    for (uint32 k = 0; k < chain.size(); ++k)
    {
        Logger::Debug("%d - %d", k, chain[k]);
    }
#endif
}
Esempio n. 27
0
 void Compass::render(RenderBatch& renderBatch) {
     renderBatch.add(this);
 }