void CUIComboObjListSceneObject::OnFrameRender(const Matrix& mTransform, double fTime, float fElapsedTime)
{
	CUIComboObjList::OnFrameRender(mTransform,fTime, fElapsedTime);
	if (!m_pRenderNode)
	{
		return;
	}
	CRenderSystem& R = GetRenderSystem();
	R.setViewport(m_ListBoxDisplay.GetBoundingBox());
	R.SetSamplerFilter(0, TEXF_LINEAR, TEXF_LINEAR, TEXF_LINEAR);
	R.SetSamplerFilter(1, TEXF_LINEAR, TEXF_LINEAR, TEXF_LINEAR);
	Matrix mView,mProj;
	BBox bbox  = m_pRenderNode->getBBox();
	Vec3D vCenter = (bbox.vMax+bbox.vMin)*0.5f;
	float fWidth = (bbox.vMax-bbox.vMin).length();
	float fHeight = fWidth*(m_ListBoxDisplay.GetBoundingBox().bottom-m_ListBoxDisplay.GetBoundingBox().top)/
		(m_ListBoxDisplay.GetBoundingBox().right-m_ListBoxDisplay.GetBoundingBox().left);
	mView.MatrixLookAtLH(Vec3D(sinf(fTime)*fWidth,abs(sinf(fTime*0.1f)*fWidth),cosf(fTime)*fWidth),vCenter,Vec3D(0,1.0f,0));
	mProj.MatrixOrthoLH(fWidth,fHeight,0.1f, 256.0f);
	R.setViewMatrix(mView);
	R.setProjectionMatrix(mProj);
	{
		R.ClearBuffer(true,false,0x0);
		m_pRenderNode->render(Matrix::UNIT);
	}
	R.SetupRenderState();
	R.setViewport(GetParentDialog()->GetParentDialog()->GetParentDialog()->GetBoundingBox());
}
	void SkyboxRenderObject::SetRenderSystem(RenderSystem * renderSystem)
	{
		bool adding = (GetRenderSystem() == NULL && renderSystem != NULL);
		bool removing = (GetRenderSystem() != NULL && renderSystem == NULL);
		bool switching = (GetRenderSystem() != NULL && renderSystem != NULL);
		
		if(removing || switching)
		{
			GetRenderSystem()->UnregisterFromUpdate(this);
		}
		
		RenderObject::SetRenderSystem(renderSystem);
		
		if(adding || switching)
		{
			GetRenderSystem()->RegisterForUpdate(this);
		}
	}
Exemple #3
0
void CLodMesh::draw(size_t uLodLevel)const
{
	if (m_Lods.size()>uLodLevel)
	{
		CRenderSystem& R = GetRenderSystem();
		const std::vector<IndexedSubset>& setSubset = m_Lods[ uLodLevel ].setSubset;
		for (std::vector<IndexedSubset>::const_iterator it=setSubset.begin(); it!=setSubset.end(); it++)
		{
			R.drawIndexedSubset(*it);
		}
	}
}
Exemple #4
0
void EditorScene::UpdateShadowColorFromLandscape()
{
	// try to get shadow color for landscape
	Entity *land = GetLandscapeNode(this);
	if(!land) return;

	KeyedArchive * props = land->GetCustomProperties();
	if (props->IsKeyExists("ShadowColor"))
	{
		GetRenderSystem()->SetShadowRectColor(props->GetVariant("ShadowColor")->AsColor());
	}
}
Exemple #5
0
void CLodMesh::drawSub(size_t uSubID, size_t uLodLevel)const
{
	if (m_Lods.size()<=uLodLevel)
	{
		return;
	}
	if (m_Lods[uLodLevel].setSubset.size()<=uSubID)
	{
		return;
	}
	const IndexedSubset &subset = m_Lods[uLodLevel].setSubset[uSubID];
	GetRenderSystem().drawIndexedSubset(subset);
}
Exemple #6
0
void CBoundMesh::draw()const
{
	if (indices.size())
	{
		CRenderSystem& R = GetRenderSystem();
		if (R.prepareMaterial("BoundMesh"))
		{
			R.SetFillMode(FILL_WIREFRAME);
			R.DrawIndexedPrimitiveUP(VROT_TRIANGLE_LIST,
				0, indices.size(), indices.size()/3,
				&indices[0], &pos[0], sizeof(Vec3D));
			R.SetFillMode(FILL_SOLID);
			R.finishMaterial();
		}
	}
}
void CUIComboObjListTile::OnListBoxObjectSelection()
{
	if (NULL==m_pScene)
	{
		return;
	}
	unsigned char uTileIndex = (unsigned char)m_ListBoxObject.GetSelectedData();
	((CTerrainEditor*)(m_pScene->getTerrainData()))->GetBrushDecal().SetTileID(uTileIndex);
	
	std::string strMaterial = getSelectedTileMaterial();
	if (strMaterial.length()>0)
	{
		CMaterial& material = GetRenderSystem().getMaterialMgr().getItem(strMaterial.c_str());
		m_uTileTexID = material.uTexture[0];
	}
}
void CUIComboObjListTile::SelectObjectByObjectID(size_t id)
{
	if (NULL==m_pScene)
	{
		return;
	}

	int nIndex = m_ListBoxObject.getItemIndexByData((void*)(id));
	m_ListBoxObject.SelectItem(nIndex);

	std::string strMaterial = getSelectedTileMaterial();
	if (strMaterial.length()>0)
	{
		CMaterial& material = GetRenderSystem().getMaterialMgr().getItem(strMaterial.c_str());
		m_uTileTexID = material.uTexture[0];
	}
}
Exemple #9
0
bool CLodMesh::SetMeshSource(int nLodLevel, CHardwareVertexBuffer* pSkinVB)const
{
	CRenderSystem& R = GetRenderSystem();
	if (m_bSkinMesh)
	{
		if (pSkinVB)
		{
			R.SetVertexDeclaration(m_pVertexDeclHardware);
			R.SetStreamSource(0, pSkinVB, 0, sizeof(SkinnedVertex));
			if (m_pShareBuffer)
			{
				R.SetStreamSource(1, m_pShareBuffer, 0, m_uShareVertexSize);
			}
			//GetRenderSystem().GetDevice()->SetStreamSourceFreq(0, D3DSTREAMSOURCE_INDEXEDDATA | 1ul);
			//GetRenderSystem().GetDevice()->SetStreamSourceFreq(1, D3DSTREAMSOURCE_INDEXEDDATA | 1ul);
			//GetRenderSystem().GetDevice()->SetStreamSourceFreq(1, D3DSTREAMSOURCE_INSTANCEDATA | 1ul);
		}
		else
		{
			return false;
		}
	}
	else
	{
		if (m_pShareBuffer)
		{
			R.SetVertexDeclaration(m_pVertexDeclHardware);
			R.SetStreamSource(0, m_pShareBuffer, 0, m_uShareVertexSize);
		}
		else
		{
			return false;
		}
	}
	if (m_Lods[ nLodLevel ].pIB)
	{
		R.SetIndices(m_Lods[ nLodLevel ].pIB);	
	}
	else
	{
		return false;
	}
	return true;
}
Exemple #10
0
void CLodMesh::init()
{
	for(size_t i=0;i<m_setSubMesh.size();++i)
	{
		if (false==m_bSkinMesh)
		{
			if(m_setSubMesh[i].bone.size()>0)
			{
				m_bSkinMesh = true;
				break;
			}
		}
	}
	if (!m_bSkinMesh)
	{
		//weight.clear();
		//bone.clear();
	}
	size_t uVertexCount=0;
	std::vector<std::vector<VertexIndex>> setVecVertexIndex;
	if (m_setSubMesh.size()!=0)
	{
		setVecVertexIndex.resize(m_setSubMesh.size());
		m_Lods.resize(1);
		IndexedSubset subset;
		std::vector<unsigned short> setIndex;
		for (size_t i=0;i<m_setSubMesh.size();++i)
		{
			CSubMesh& subMesh = m_setSubMesh[i];
			std::vector<VertexIndex>& setVertexIndex=setVecVertexIndex[i];

			transformRedundance(subMesh.m_setVertexIndex,setVertexIndex,setIndex);
			subset.vstart = 0;	// 因为每个sub都是独立的ib索引编号 从0开始,所以只需要设置vbase(vb地址偏移),有些显卡在误设置vstart(IB范围后)会不显示。
			subset.vbase += subset.vcount;
			subset.istart += subset.icount;
			subset.vcount = setVertexIndex.size();
			subset.icount = setIndex.size()-subset.istart;
			m_Lods[0].setSubset.push_back(subset);
			uVertexCount+=setVertexIndex.size();
		}
		transformRedundance(setIndex,m_Lods[0].IndexLookup,m_Lods[0].Indices);
	}
	else
	{
		/*for (size_t i=0; i<pos.size(); ++i)
		{
			VertexIndex vertexIndex;
			if (i<pos.size())
			{
				vertexIndex.p=i;
			}
			if (i<normal.size())
			{
				vertexIndex.n=i;
			}
			if (i<color.size())
			{
				vertexIndex.c=i;
			}
			if (i<texcoord.size())
			{
				vertexIndex.uv1=i;
			}
			if (i<texcoord2.size())
			{
				vertexIndex.uv2=i;
			}
			if (i<weight.size())
			{
				vertexIndex.w=i;
			}
			if (i<bone.size())
			{
				vertexIndex.b=i;
			}
			setVertexIndex.push_back(vertexIndex);
		}*/
	}
	if (m_bSkinMesh)
	{
		for (size_t i=0;i<setVecVertexIndex.size();++i)
		{
			CSubMesh& subMesh=m_setSubMesh[i];
			std::vector<VertexIndex>& setVertexIndex=setVecVertexIndex[i];
			for (size_t n=0;n<setVertexIndex.size();++n)
			{
				VertexIndex& vertexIndex=setVertexIndex[n];
				SkinVertex skinVertex;
				skinVertex.p = subMesh.pos[vertexIndex.p];
				skinVertex.n = subMesh.normal[vertexIndex.n];
				skinVertex.w4 = subMesh.weight[vertexIndex.w];
				skinVertex.b4 = subMesh.bone[vertexIndex.b];
				m_setSkinVertex.push_back(skinVertex);
			}
		}
	}
	bool bPos		= false;
	bool bNormal	= false;
	bool bColor		= false;
	bool bTexCoord	= false;
	bool bTexCoord2	= false;
	for (size_t i=0;i<m_setSubMesh.size();++i)
	{
		CSubMesh& subMesh=m_setSubMesh[i];
		if (subMesh.pos.size()>0)
		{
			bPos=true;
		}
		if (subMesh.normal.size()>0)
		{
			bNormal=true;
		}
		if (subMesh.color.size()>0)
		{
			bColor=true;
		}
		if (subMesh.texcoord.size()>0)
		{
			bTexCoord=true;
		}
		if (subMesh.texcoord2.size()>0)
		{
			bTexCoord2=true;
		}
	}

	m_pVertexDeclHardware = GetRenderSystem().CreateVertexDeclaration();

	unsigned long dwFVF = 0;
	unsigned short uOffset = 0;
	m_uSkinVertexSize = 0;
	unsigned short uStream = 0;
	// pos
	if (bPos)
	{
		m_pVertexDeclHardware->AddElement(uStream, uOffset, VET_FLOAT3, VES_POSITION);
		uOffset += sizeof(Vec3D);
	}
	// normal
	if (bNormal)
	{
		m_pVertexDeclHardware->AddElement(uStream, uOffset, VET_FLOAT3, VES_NORMAL);
		uOffset += sizeof(Vec3D);
	}
	//// 当为蒙皮时,只创建固定的公用的纹理UV缓存 // 创建刚体网格的公用的VB
	if (m_bSkinMesh)
	{
		m_uSkinVertexSize = uOffset;
		uOffset = 0; 
		uStream = 1;
	}
	// color
	if (bColor)
	{
		m_pVertexDeclHardware->AddElement(uStream, uOffset, VET_COLOUR, VES_DIFFUSE);
		uOffset += sizeof(unsigned long);
	}
	// texCoord
	if (bTexCoord)
	{
		m_pVertexDeclHardware->AddElement(uStream, uOffset, VET_FLOAT2, VES_TEXTURE_COORDINATES);
		uOffset += sizeof(Vec2D);
	}
	// texCoord2
	if (bTexCoord2)
	{
		m_pVertexDeclHardware->AddElement(uStream, uOffset, VET_FLOAT2, VES_TEXTURE_COORDINATES, 1);
		uOffset += sizeof(Vec2D);
	}
	//
	m_pVertexDeclHardware->EndElement();
	m_uShareVertexSize = uOffset;

	// 	m_dwFVF |= bColor?D3DFVF_DIFFUSE:0;
	// 	m_dwFVF |= bTexCoord?D3DFVF_TEX1:0;

	// 当为蒙皮时,只创建固定的公用的纹理UV缓存
	// 创建刚体网格的公用的VB
	if (m_uShareVertexSize > 0)
	{
		m_pShareBuffer = GetRenderSystem().GetHardwareBufferMgr().CreateVertexBuffer(uVertexCount, m_uShareVertexSize);
		if (m_pShareBuffer)
		{
			unsigned char* pBuffer = (unsigned char*)m_pShareBuffer->lock(CHardwareBuffer::HBL_NORMAL);
			if (pBuffer)
			{
				for (size_t i=0;i<setVecVertexIndex.size();++i)
				{
					CSubMesh& subMesh=m_setSubMesh[i];
					std::vector<VertexIndex>& setVertexIndex=setVecVertexIndex[i];
					for (size_t n=0;n<setVertexIndex.size();++n)
					{
						VertexIndex& vertexIndex=setVertexIndex[n];
							if (!m_bSkinMesh)
						{
							if (bPos)
							{
								*(Vec3D*)pBuffer = subMesh.pos[vertexIndex.p];
								pBuffer += sizeof(Vec3D);
							}
							if (bNormal)
							{
								*(Vec3D*)pBuffer = subMesh.normal[vertexIndex.n];
								pBuffer += sizeof(Vec3D);
							}
						}
						if (bColor)
						{
							*(Color32*)pBuffer = subMesh.color[vertexIndex.c];
							pBuffer += sizeof(Color32);
						}
						if (bTexCoord)
						{
							*(Vec2D*)pBuffer = subMesh.texcoord[vertexIndex.uv1];
							pBuffer += sizeof(Vec2D);
						}
						if (bTexCoord2)
						{
							*(Vec2D*)pBuffer = subMesh.texcoord2[vertexIndex.uv2];
							pBuffer += sizeof(Vec2D);
						}
					}
				}
			}
			m_pShareBuffer->unlock();
		}
	}

	// 填入IB
	for(std::vector<ModelLod>::iterator it = m_Lods.begin(); it!=m_Lods.end(); it++)
	{
		size_t indexSize = it->Indices.size();
		if (indexSize>0)
		{
			it->pIB = GetRenderSystem().GetHardwareBufferMgr().CreateIndexBuffer(indexSize);
			if (it->pIB)
			{
				unsigned short* indices = (unsigned short*)it->pIB->lock(CHardwareBuffer::HBL_NORMAL);
				if (indices)
				{
					for (size_t i=0;i<indexSize;++i)
					{
						indices[i] = it->IndexLookup[ it->Indices[i] ];
					}
				}
				it->pIB->unlock();
			}
		}
	}
}
Exemple #11
0
ShadowVolumeRenderPass::eBlend EditorScene::GetShadowBlendMode()
{
	ShadowVolumeRenderPass *shadowPass = DynamicTypeCheck<ShadowVolumeRenderPass*>( GetRenderSystem()->GetRenderPass(PASS_SHADOW_VOLUME) );
	return shadowPass->GetBlendMode();
}
Exemple #12
0
void EditorScene::SetShadowBlendMode( ShadowVolumeRenderPass::eBlend blend )
{
	ShadowVolumeRenderPass *shadowPass = DynamicTypeCheck<ShadowVolumeRenderPass*>( GetRenderSystem()->GetRenderPass(PASS_SHADOW_VOLUME) );
	shadowPass->SetBlendMode(blend);

}
Exemple #13
0
Color EditorScene::GetShadowColor()
{
	return GetRenderSystem()->GetShadowRectColor();
}