TRef<Geo> Execute(const Matrix& mat, GroupGeo* pgroup) { ZString strName = pgroup->GetName(); if (!strName.IsEmpty()) { if ( strName.Find("frm-") == 0 && (!pgroup->AnyChildGroups()) ) { Vector vecPosition = mat.Transform(Vector(0, 0, 0)); Vector vecForward = mat.TransformDirection(Vector(0, 0, -1)); Vector vecUp = mat.TransformDirection(Vector(0, 1, 0)); strName = strName.RightOf(4); if (strName.Find("SS") != -1) { // // a strobe light // ValueList* plist = pgroup->GetList(); if (plist->GetCount() == 1) { MaterialGeo* pmatGeo; CastTo(pmatGeo, plist->GetFirst()); Material* pmaterial = pmatGeo->GetMaterial(); AddLight(strName, pmaterial->GetDiffuse(), vecPosition); } else { AddLight(strName, Color(1, 1, 1), vecPosition); } return Geo::GetEmpty(); } else if ( strName.Find("thrust") != -1 || strName.Find("smoke") != -1 || strName.Find("rocket") != -1 ) { // // this is an engine // m_pframes->GetList().PushFront( FrameData(strName, vecPosition, vecForward, vecUp) ); return Geo::GetEmpty(); } else if ( (strName.Find("weapon") != -1) || (strName.Find("wepatt") != -1) || (strName.Find("wepemt") != -1) || (strName.Find("wepmnt") != -1) || (strName.Find("trail") != -1) ) { // // This is an attachment point // m_pframes->GetList().PushFront( FrameData(strName, vecPosition, vecForward, vecUp) ); return Geo::GetEmpty(); } else if ( (strName.Find("garage") != -1) ) { // // This is a garage we need to leave the frame in the graph // m_pframes->GetList().PushFront( FrameData(strName, vecPosition, vecForward, vecUp) ); } } } return NULL; }
void Kdtree::buildGPU( std::list<IModel*> &modelList, std::list<Triangle*> &triangleList, GPUAccelerationStructureData& accelStructData ) { #ifndef STUB // first build for CPU build( modelList ); // set GPU data sizes accelStructData.setTraversalShaderFilename( "shaders/Kdtree_restart.cg" ); accelStructData.setCellData0Count( m_NodeUsed ); accelStructData.setVertexCount( m_TotalTreeTri * 3 ); accelStructData.setNormalCount( m_TotalTreeTri * 3 ); accelStructData.setMaterialCount( m_TotalTreeTri ); // store the triangle data using pointers into the current lists // this is faster than using indices float* pv0 = accelStructData.m_pVertex0Array; float* pv1 = accelStructData.m_pVertex1Array; float* pv2 = accelStructData.m_pVertex2Array; float* pn0 = accelStructData.m_pNormal0Array; float* pn1 = accelStructData.m_pNormal1Array; float* pn2 = accelStructData.m_pNormal2Array; float* pm0 = accelStructData.m_pMaterial0Array; float* pg0 = accelStructData.m_pCellData0; Vertex v; Material m; // then extract out information float currentTriangleIndex = 0; for ( unsigned int i = 0; i < m_TotalNode; i++ ) { if ( !m_pTree[i].isLeaf() ) { // this is an Intermediate node (*pg0) = (float)m_pTree[i].leftChild; pg0++; (*pg0) = m_pTree[i].SplitPos(); pg0++; (*pg0) = 0; pg0++; (*pg0) = (float)-(m_pTree[i].splitAxis()+2);pg0++; } else { // this is a leaf node (*pg0) = currentTriangleIndex; pg0++; (*pg0) = 0; pg0++; (*pg0) = 0; pg0++; (*pg0) = (float)m_pTree[i].nTriangle(); pg0++; //std::list< IPrimitive* >& pPrims = *(m_pTree[i].m_pPrimList); //std::list< IPrimitive* >& pPrims = *(m_pTree[i].m_pPrimList); //std::list< IPrimitive* >::iterator ip; for (int ti = 0; ti < m_pTree[i].nTriangle(); ti++)//(ip = pPrims.begin(); ip != pPrims.end(); ip++ ) { if(i == 4829) printf("why"); int abc = m_pTree[i].nTriangle(); std::list< Triangle* >* pTris = m_pTree[i].m_pPrimList[ti]->getNewTesselation(); std::list< Triangle* >::iterator itp; currentTriangleIndex += pTris->size(); for ( itp = pTris->begin(); itp != pTris->end(); itp++ ) { // Material m = *((*itp)->getMaterial()); *pm0 = m.GetDiffuse().R(); pm0++; *pm0 = m.GetDiffuse().G(); pm0++; *pm0 = m.GetDiffuse().B(); pm0++; *pm0 = m.GetSpecularExponent(); pm0++; // vertex 0 v = *((*itp)->getVertex0()); *pv0 = v.getCoordinates().X(); pv0++; *pv0 = v.getCoordinates().Y(); pv0++; *pv0 = v.getCoordinates().Z(); pv0++; *pv0 = 0.0f; pv0++; *pn0 = v.getNormal().X(); pn0++; *pn0 = v.getNormal().Y(); pn0++; *pn0 = v.getNormal().Z(); pn0++; *pn0 = 0.0f; pn0++; // vertex 1 v = *((*itp)->getVertex1()); *pv1 = v.getCoordinates().X(); pv1++; *pv1 = v.getCoordinates().Y(); pv1++; *pv1 = v.getCoordinates().Z(); pv1++; *pv1 = 0.0f; pv1++; *pn1 = v.getNormal().X(); pn1++; *pn1 = v.getNormal().Y(); pn1++; *pn1 = v.getNormal().Z(); pn1++; *pn1 = 0.0f; pn1++; // vertex 2 v = *((*itp)->getVertex2()); *pv2 = v.getCoordinates().X(); pv2++; *pv2 = v.getCoordinates().Y(); pv2++; *pv2 = v.getCoordinates().Z(); pv2++; *pv2 = 0.0f; pv2++; *pn2 = v.getNormal().X(); pn2++; *pn2 = v.getNormal().Y(); pn2++; *pn2 = v.getNormal().Z(); pn2++; *pn2 = 0.0f; pn2++; // cleanup New Triangles from getNewTesselation() delete *itp; *itp = NULL; } // triangles pTris->clear(); delete pTris; pTris = NULL; } // prims }// end leaf node } // end node loop #endif }
// ///////////////////////////////////////////////////////////////// // // ///////////////////////////////////////////////////////////////// void Pool3dActorParams::SetMaterial(const Material &material) { m_material = material; // Don't forget to set the actors color to the same value as its diffuse color! VSetColor(material.GetDiffuse()); }
/*********************** * HitInfo BasicAS::buildGPU( Scene& l_pScene, GPUAccelerationStructureData& l_pASD ) * * builds the scene into a GPU Acceleration Structure based on a Basic structre ***********************/ void BasicAS::buildGPU(std::list<IModel*> &modelList, std::list<Triangle*> &triangleList, GPUAccelerationStructureData& l_pASD ) { #ifndef STUB // set GPUdata Sizes if ( triangleList.size() == 0 ) { assert( !"Error in BasicAS:buildGPU - getnewTesselation returned no triangles." ); } l_pASD.setTraversalShaderFilename( "shaders\\BasicAS.cg" ); l_pASD.setVertexCount( (unsigned int)triangleList.size()*3 ); // each triangle has 3 vertices l_pASD.setNormalCount( (unsigned int)triangleList.size()*3 ); // each triangle has 3 normals l_pASD.setMaterialCount( (unsigned int)triangleList.size() ); // each triangle has 1 material l_pASD.setCellData0Count( 1 ); // x = #of vertices, y = unused, z = unused, w = unused // store how many triangles there are l_pASD.m_pCellData0[0] = (float)triangleList.size(); // store the triangle data using pointers into the current lists // this is faster than using indices float* pv0 = l_pASD.m_pVertex0Array; float* pv1 = l_pASD.m_pVertex1Array; float* pv2 = l_pASD.m_pVertex2Array; float* pn0 = l_pASD.m_pNormal0Array; float* pn1 = l_pASD.m_pNormal1Array; float* pn2 = l_pASD.m_pNormal2Array; float* pm0 = l_pASD.m_pMaterial0Array; Vertex v; Material m; std::list<Triangle*>::iterator triIter; for ( triIter = triangleList.begin(); triIter != triangleList.end(); triIter++ ) { // (*var)++ : sets value then increments pointer // Material m = *((*triIter)->getMaterial()); *pm0 = m.GetDiffuse().R(); pm0++; *pm0 = m.GetDiffuse().G(); pm0++; *pm0 = m.GetDiffuse().B(); pm0++; *pm0 = m.GetSpecularExponent(); pm0++; // vertex 0 v = *((*triIter)->getVertex0()); *pv0 = v.getCoordinates().X(); pv0++; *pv0 = v.getCoordinates().Y(); pv0++; *pv0 = v.getCoordinates().Z(); pv0++; *pv0 = 1.0f; pv0++; *pn0 = v.getNormal().X(); pn0++; *pn0 = v.getNormal().Y(); pn0++; *pn0 = v.getNormal().Z(); pn0++; *pn0 = 1.0f; pn0++; // vertex 1 v = *((*triIter)->getVertex1()); *pv1 = v.getCoordinates().X(); pv1++; *pv1 = v.getCoordinates().Y(); pv1++; *pv1 = v.getCoordinates().Z(); pv1++; *pv1 = 1.0f; pv1++; *pn1 = v.getNormal().X(); pn1++; *pn1 = v.getNormal().Y(); pn1++; *pn1 = v.getNormal().Z(); pn1++; *pn1 = 1.0f; pn1++; // vertex 2 v = *((*triIter)->getVertex2()); *pv2 = v.getCoordinates().X(); pv2++; *pv2 = v.getCoordinates().Y(); pv2++; *pv2 = v.getCoordinates().Z(); pv2++; *pv2 = 1.0f; pv2++; *pn2 = v.getNormal().X(); pn2++; *pn2 = v.getNormal().Y(); pn2++; *pn2 = v.getNormal().Z(); pn2++; *pn2 = 1.0f; pn2++; } #endif }