Example #1
0
void touchmind::layout::LayoutManager::Arrange()
{
    m_layoutWorkDataMap.clear();
    mw_maxLevelHeight.clear();
    mw_maxLevelWidth.clear();
    mw_previousLevelNode.clear();
    mw_rootXOffset = 0.0f;
    mw_rootYOffset = 0.0f;
    AssignPosition();
    _CalculateSize();
    PositionTree();
}
Example #2
0
void CSpeedTreeWrapper::RenderFronds(void) const
{
	m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_FrondGeometry);

	if (m_pGeometryCache->m_fFrondAlphaTestValue > 0.0f)
	{
		PositionTree( );
		m_pDx->SetRenderState(D3DRS_ALPHAREF, DWORD(m_pGeometryCache->m_fFrondAlphaTestValue));

		// if tree has fronds, draw them
		if (m_pFrondIndexCounts && m_pGeometryCache->m_sFronds.m_nDiscreteLodLevel > -1 && m_pFrondIndexCounts[m_pGeometryCache->m_sFronds.m_nDiscreteLodLevel] > 0)
			m_pDx->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP, 0, 0, m_pGeometryCache->m_sFronds.m_usVertexCount, 0, m_pFrondIndexCounts[m_pGeometryCache->m_sFronds.m_nDiscreteLodLevel] - 2);

	}
}
Example #3
0
void CSpeedTreeWrapper::RenderBranches(void) const
{
	m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_BranchGeometry);

	if (m_pGeometryCache->m_fBranchAlphaTestValue > 0.0f)
	{
		PositionTree( );

		// set alpha test value
		m_pDx->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
		m_pDx->SetRenderState(D3DRS_ALPHAREF, DWORD(m_pGeometryCache->m_fBranchAlphaTestValue));

		// if tree has branches at this LOD, draw them
		if (m_pBranchIndexCounts && m_pGeometryCache->m_sBranches.m_nDiscreteLodLevel > -1 && m_pBranchIndexCounts[m_pGeometryCache->m_sBranches.m_nDiscreteLodLevel] > 0)
			m_pDx->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP, 0, 0, m_pGeometryCache->m_sBranches.m_usVertexCount, 0, m_pBranchIndexCounts[m_pGeometryCache->m_sBranches.m_nDiscreteLodLevel] - 2);
	}
}
Example #4
0
void CSpeedTreeWrapper::RenderBillboards(void) const
{
	// draw billboards in immediate mode (as close as directx gets to immediate mode)
	#ifdef WRAPPER_BILLBOARD_MODE
		PositionTree( );	

		struct SBillboardVertex 
		{
			float fX, fY, fZ;
			DWORD dColor;
			float fU, fV;
		};

		m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_BillboardGeometry);
		if (m_pGeometryCache->m_sBillboard0.m_bIsActive)
		{
			const float* pCoords = m_pGeometryCache->m_sBillboard0.m_pCoords;
			const float* pTexCoords = m_pGeometryCache->m_sBillboard0.m_pTexCoords;
			SBillboardVertex sVertex[4] = 
			{
				{ pCoords[0], pCoords[1], pCoords[2], 0xffffff, pTexCoords[0], pTexCoords[1] },
				{ pCoords[3], pCoords[4], pCoords[5], 0xffffff, pTexCoords[2], pTexCoords[3] },
				{ pCoords[6], pCoords[7], pCoords[8], 0xffffff, pTexCoords[4], pTexCoords[5] },
				{ pCoords[9], pCoords[10], pCoords[11], 0xffffff, pTexCoords[6], pTexCoords[7] },
			};
			m_pDx->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1);
			m_pDx->SetRenderState(D3DRS_ALPHAREF, DWORD(m_pGeometryCache->m_sBillboard0.m_fAlphaTestValue));
			m_pDx->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, sVertex, sizeof(SBillboardVertex));
		}

		// if there is a 360 degree billboard, then we need to draw the second one
		if (m_pGeometryCache->m_sBillboard1.m_bIsActive)
		{
			const float* pCoords = m_pGeometryCache->m_sBillboard1.m_pCoords;
			const float* pTexCoords = m_pGeometryCache->m_sBillboard1.m_pTexCoords;
			SBillboardVertex sVertex[4] = 
			{
				{ pCoords[0], pCoords[1], pCoords[2], 0xffffff, pTexCoords[0], pTexCoords[1] },
				{ pCoords[3], pCoords[4], pCoords[5], 0xffffff, pTexCoords[2], pTexCoords[3] },
				{ pCoords[6], pCoords[7], pCoords[8], 0xffffff, pTexCoords[4], pTexCoords[5] },
				{ pCoords[9], pCoords[10], pCoords[11], 0xffffff, pTexCoords[6], pTexCoords[7] },
			};
			m_pDx->SetRenderState(D3DRS_ALPHAREF, DWORD(m_pGeometryCache->m_sBillboard1.m_fAlphaTestValue));
			m_pDx->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, sVertex, sizeof(SBillboardVertex));
		}

		// if we have a horizontal bilboard and it is enabled, draw it too 
		#ifdef WRAPPER_RENDER_HORIZONTAL_BILLBOARD
			if (m_pGeometryCache->m_sHorizontalBillboard.m_bIsActive)
			{	
				const float* pCoords = m_pGeometryCache->m_sHorizontalBillboard.m_pCoords;
				const float* pTexCoords = m_pGeometryCache->m_sHorizontalBillboard.m_pTexCoords;
				SBillboardVertex sVertex[4] = 
				{
					{ pCoords[0], pCoords[1], pCoords[2], pTexCoords[0], pTexCoords[1] },
					{ pCoords[3], pCoords[4], pCoords[5], pTexCoords[2], pTexCoords[3] },
					{ pCoords[6], pCoords[7], pCoords[8], pTexCoords[4], pTexCoords[5] },
					{ pCoords[9], pCoords[10], pCoords[11], pTexCoords[6], pTexCoords[7] },
				};
				m_pDx->SetRenderState(D3DRS_ALPHAREF, DWORD(m_pGeometryCache->m_sHorizontalBillboard.m_fAlphaTestValue));
				m_pDx->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, sVertex, sizeof(SBillboardVertex));
			}

		#endif
	#endif
}
Example #5
0
void CSpeedTreeWrapper::RenderLeaves(void) const
{
	#ifdef WRAPPER_USE_GPU_LEAF_PLACEMENT
		m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_LeafGeometry, -1, -1, 0);
	#endif
	m_pSpeedTree->GetGeometry(*m_pGeometryCache, SpeedTree_LeafGeometry);

	// update the LOD level vertex arrays we need
	#if defined(WRAPPER_USE_GPU_LEAF_PLACEMENT) && defined(WRAPPER_USE_GPU_WIND)
		// do nothing
	#else
		#if !defined WRAPPER_USE_NO_WIND || defined WRAPPER_USE_CPU_LEAF_PLACEMENT
			// might need to draw 2 LOD's
			for (unsigned int i = 0; i < 2; ++i)
			{
				// reference to leaves structure
				const CSpeedTreeRT::SGeometry::SLeaf* pLeaf = (i == 0) ? &m_pGeometryCache->m_sLeaves0 : &m_pGeometryCache->m_sLeaves1;
				int unLod = pLeaf->m_nDiscreteLodLevel;

				#if defined WRAPPER_USE_GPU_LEAF_PLACEMENT
					if (pLeaf->m_bIsActive && !m_pLeavesUpdatedByCpu[unLod])
					{
						// update the centers
						SFVFLeafVertex* pVertex = NULL;
						m_pLeafVertexBuffer[unLod]->Lock(0, 0, reinterpret_cast<void**>(&pVertex), 0);
						for (unsigned int unLeaf = 0; unLeaf < pLeaf->m_usLeafCount; ++unLeaf)
						{
							D3DXVECTOR3 vecCenter(&(pLeaf->m_pCenterCoords[unLeaf * 3]));
							(pVertex++)->m_vPosition = vecCenter;		// vertex 0
							(pVertex++)->m_vPosition = vecCenter;		// vertex 1
							(pVertex++)->m_vPosition = vecCenter;		// vertex 2
							(pVertex++)->m_vPosition = vecCenter;		// vertex 0
							(pVertex++)->m_vPosition = vecCenter;		// vertex 2
							(pVertex++)->m_vPosition = vecCenter;		// vertex 3
						}
						m_pLeafVertexBuffer[unLod]->Unlock( );
						m_pLeavesUpdatedByCpu[unLod] = true;
					}
				#else
					if (pLeaf->m_bIsActive)
					{ 
						// update the vertices
						SFVFLeafVertex* pVertex = NULL;
						m_pLeafVertexBuffer[unLod]->Lock(0, 0, reinterpret_cast<void**>(&pVertex),0);
						for (unsigned int unLeaf = 0; unLeaf < pLeaf->m_usLeafCount; ++unLeaf)
						{
							D3DXVECTOR3 vecCenter(&(pLeaf->m_pCenterCoords[unLeaf * 3]));
							D3DXVECTOR3 vec0(&pLeaf->m_pLeafMapCoords[unLeaf][0]);
							D3DXVECTOR3 vec1(&pLeaf->m_pLeafMapCoords[unLeaf][4]);
							D3DXVECTOR3 vec2(&pLeaf->m_pLeafMapCoords[unLeaf][8]);
							D3DXVECTOR3 vec3(&pLeaf->m_pLeafMapCoords[unLeaf][12]);

							(pVertex++)->m_vPosition = vecCenter + vec0;		// vertex 0
							(pVertex++)->m_vPosition = vecCenter + vec1;		// vertex 1
							(pVertex++)->m_vPosition = vecCenter + vec2;		// vertex 2
							(pVertex++)->m_vPosition = vecCenter + vec0;		// vertex 0
							(pVertex++)->m_vPosition = vecCenter + vec2;		// vertex 2
							(pVertex++)->m_vPosition = vecCenter + vec3;		// vertex 3
						}
						m_pLeafVertexBuffer[unLod]->Unlock( );
					}
				#endif
			}
		#endif
	#endif

	PositionTree( );

	// might need to draw 2 LOD's
	for (unsigned int unLeafLevel = 0; unLeafLevel < 2; ++unLeafLevel)
	{
		const CSpeedTreeRT::SGeometry::SLeaf* pLeaf = (unLeafLevel == 0) ?
			&m_pGeometryCache->m_sLeaves0 : pLeaf = &m_pGeometryCache->m_sLeaves1;

		int unLod = pLeaf->m_nDiscreteLodLevel;

		// if this LOD is active and has leaves, draw it
		if (unLod > -1 && pLeaf->m_bIsActive && pLeaf->m_usLeafCount > 0)
		{
			m_pDx->SetStreamSource(0, m_pLeafVertexBuffer[unLod], 0, sizeof(SFVFLeafVertex));
			m_pDx->SetRenderState(D3DRS_ALPHAREF, DWORD(pLeaf->m_fAlphaTestValue));
			m_pDx->DrawPrimitive(D3DPT_TRIANGLELIST, 0, pLeaf->m_usLeafCount * 2);
		}
	}
}