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;
    }
Example #2
0
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
}
Example #3
0
	// /////////////////////////////////////////////////////////////////
	//
	// /////////////////////////////////////////////////////////////////
	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());
	}
Example #4
0
/***********************
* 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
}