示例#1
0
// ------------------------------------------------------------------------------------------------
// Construct a mesh with a specific shape (callback)
aiMesh* StandardShapes::MakeMesh (unsigned int num,  void (*GenerateFunc)(
	unsigned int,std::vector<aiVector3D>&))
{
	std::vector<aiVector3D> temp;
	(*GenerateFunc)(num,temp);
	return MakeMesh(temp,3);
}
示例#2
0
// ------------------------------------------------------------------------------------------------
// Construct a mesh with a specific shape (callback)
aiMesh* StandardShapes::MakeMesh ( unsigned int (*GenerateFunc)(
	std::vector<aiVector3D>&, bool))
{
	std::vector<aiVector3D> temp;
	unsigned num = (*GenerateFunc)(temp,true);
	return MakeMesh(temp,num);
}
示例#3
0
DX_Frame* dxExporter::MakeObjectFrame( int obj )
{
	DX_STRING            nodeName, tempName;

	DX_Frame *dx_root = _sceneRoot;
	DX_Frame *dx_lst  = _sceneRoot;
	DX_Frame *dx_frm;

	int  num_layer = globals_.getObjectFuncs()->maxLayers( obj );

	for (int n = 0; n < num_layer; n++)
	{
		if(globals_.getObjectFuncs()->layerExists( obj, n )) {
			LWW::MeshInfo mesh = globals_.layerMesh( obj, n );
			dx_frm = new DX_Frame;
			dx_frm->idx                  = dx_lst ? dx_lst->idx+1 : 0;
			dx_frm->frameType            = DX_FRAME_MESH;
			dx_frm->frameTransformMatrix = MakeFrameMatrix( NULL );
			dx_frm->mesh                 = MakeMesh( mesh );
			dx_frm->parent               = NULL;
			dx_frm->child                = NULL;
			dx_frm->sibling              = NULL;
			dx_frm->next                 = NULL;

			DX_FileUniqName( tempName, mesh.filename() );
			if(mesh.name()) _snprintf( nodeName, sizeof(nodeName), "%s%d_%s_%s", _options->framePrefix, dx_frm->idx, tempName, mesh.name() );
			else _snprintf( nodeName, sizeof(nodeName), "%s%d_%s_Layer%d", _options->framePrefix, dx_frm->idx, tempName, n+1 );
			DX_MakeNodeName( dx_frm->nodeName, nodeName );

			if (dx_lst) {
				dx_lst->next = dx_frm;
				if (dx_lst != dx_root) {
					dx_lst->sibling = dx_frm;
				}
			}
			if (dx_root->child == NULL) {
				dx_root->child = dx_frm;
				dx_frm->parent = dx_root;
			}
			dx_lst = dx_frm;
		}
	}

	return dx_frm;
}
示例#4
0
DX_Frame* dxExporter::MakeItemFrame( LWW::Item item )
{
	DX_STRING     nodeName, tempName;

	DX_Frame*  dx_pvt = NULL;
	DX_Frame*  dx_lst = _sceneRoot;
	while (dx_lst->next) { dx_lst = dx_lst->next; }

	DX_Frame*  dx_frm = new DX_Frame;
	dx_frm->idx      = dx_lst ? dx_lst->idx+1 : 0;
	dx_frm->item     = item;
	dx_frm->mesh     = NULL;
	dx_frm->parent   = NULL;
	dx_frm->child    = NULL;
	dx_frm->sibling  = NULL;
	dx_frm->next     = NULL;

	switch (item.type()) {
	case LWI_OBJECT:
		if (item.toObject().numPoints() > 0)
			dx_frm->frameType = DX_FRAME_MESH;
		else
			dx_frm->frameType = DX_FRAME_NULL;
		break;
	case LWI_LIGHT:
		dx_frm->frameType = DX_FRAME_LIGHT;
		break;
	case LWI_CAMERA:
		dx_frm->frameType = DX_FRAME_CAMERA;
		break;
	case LWI_BONE:
		dx_frm->frameType = DX_FRAME_BONE;
		break;
	}

	dx_frm->frameTransformMatrix = MakeFrameMatrix( dx_frm );
	CalcFrameMatrix( dx_frm );

	DX_FileBodyName( tempName, (char *)item.name() );
	sprintf( nodeName, "%s%d_%s", _options->framePrefix, dx_frm->idx, tempName );
	DX_MakeNodeName( dx_frm->nodeName, nodeName );

	if (dx_lst) dx_lst->next = dx_frm;

										/*   Extra Frame for PIVOT  */

	LWDVector pivotPosition;
	item.param(LWIP_PIVOT, 0, pivotPosition);
	if (!_options->useMatrixKey && USE_PIVOT(pivotPosition))
	{
		dx_pvt = new DX_Frame;
		dx_pvt->idx                  = dx_frm->idx + 1;
		dx_pvt->item                 = item;
		dx_pvt->frameType            = DX_FRAME_PIVOT;
		dx_pvt->frameTransformMatrix = MakeFrameMatrix( dx_pvt );
		dx_pvt->mesh     = NULL;
		dx_pvt->parent   = dx_frm;
		dx_pvt->child    = NULL;
		dx_pvt->sibling  = NULL;
		dx_pvt->next     = NULL;
		CalcFrameMatrix( dx_pvt );
		DX_FileBodyName( tempName, (char *)item.name() );
		sprintf( nodeName, "%s%d_%s_Pivot", _options->framePrefix, dx_pvt->idx, tempName );
		DX_MakeNodeName( dx_pvt->nodeName, nodeName );
		dx_frm->mesh    = NULL;
		dx_frm->sibling = NULL;
		dx_frm->next    = dx_pvt;
		dx_frm->child   = dx_pvt;
	}

	if (dx_frm->frameType == DX_FRAME_MESH)
	{
		if (dx_pvt) {
			dx_pvt->mesh = MakeMesh( item.toObject().meshInfo( TRUE ) );
		} else {
			dx_frm->mesh = MakeMesh( item.toObject().meshInfo( TRUE ) );
		}
	}

	return dx_frm;
}
示例#5
0
MeshRoot * Mesh::Manager::MakeGlobe( F32 radius, U32 bands, Bitmap * texture)
{
    U32 i, j, LastIndex, BandsX2, LastBandStartIndex;
    U32 TopBandStartIndex, BottomBandStartIndex, zvert;
    U32 dowrap = 1;
//	U32 dowrap = 0;
    Vector BaseVec, BandVec, WVec, TempVec;
    F32 zmin, c1, c2, c0, stickwid, r1, r2;
    F32 *rads;

    BandsX2 = bands*2;

    Quaternion att;
    Matrix matY, matZ;
    matY.ClearData();
    matZ.ClearData();

    att.Set( PI / bands, Matrix::I.Up());
    matY.Set( att);

    att.Set( PI / bands, Matrix::I.Front());
    matZ.Set( att);

    U32 vertC = 2 + (BandsX2 + 1) * (bands - 1);
    U32 faceC = BandsX2 * bands + BandsX2 * (bands - 2);

    rads = new F32[bands + 1];
    ASSERT( rads);

    MeshRoot * root = MakeMesh( vertC, vertC, vertC, faceC, texture);
    Vector  * vects = root->vertices.data;
    Vector  * norms = root->normals.data;
    UVPair  * uvs   = root->uvs.data;
    FaceObj * faces = root->faces.data;

    zmin = 32000.0f;
    // point at the top
    BaseVec.x = 0.0f;
    BaseVec.y = radius;
    BaseVec.z = 0.0f;

    U32 vertCount = 0, faceCount = 0;
    vects[vertCount] = BaseVec;
    norms[vertCount] = norms[vertCount];
    norms[vertCount].Normalize();
    vertCount++;

    BandVec = BaseVec;

    // create the vertices in each band in turn
    for (i = 1; i < bands; i++)
    {
        // rotate around Z to the next band's latitude
        matZ.Transform( TempVec, BandVec);

        WVec = BandVec = TempVec;
        rads[i] = (F32) sqrt( WVec.x * WVec.x + WVec.z * WVec.z);
        // do the vertices in this band
        U32 startVert = vertCount;
        for (j = 0; j < BandsX2; j++)
        {
            WVec = TempVec;
            vects[vertCount] = WVec;
            norms[vertCount] = vects[vertCount];
            norms[vertCount].Normalize();
            vertCount++;

            if (WVec.z < zmin)
            {
                zmin = WVec.z;
                zvert = vertCount;
            }
            // rotate around Y to the next vertex's longitude
            matY.Transform( TempVec, WVec);
        }
        // duplicate band start vert at the end (for texture wrapping)
        vects[vertCount] = vects[startVert];
        norms[vertCount] = vects[vertCount];
        norms[vertCount].Normalize();
        vertCount++;
    }
    // point at the bottom
    BaseVec.y = -radius;
    vects[vertCount] = BaseVec;
    norms[vertCount] = vects[vertCount];
    norms[vertCount].Normalize();
    LastIndex = vertCount;
    vertCount++;

    r1 = 0.0f;
    r2 = 1.0f / (F32) bands;
    // top band
    stickwid = 100 * rads[1] / radius;
    stickwid += (100 - stickwid)/2;
    for (i = 0; i < BandsX2; i++, faceCount++)
    {
        faces[faceCount].verts[0] = 0;
//		faces[faceCount].verts[1] = ((i + 1) % BandsX2) + 1;
        faces[faceCount].verts[1] = (WORD) (((i + 1) % (BandsX2 + 1)) + 1);
        faces[faceCount].verts[2] = (WORD) (i + 1);

        faces[faceCount].norms[0] = faces[faceCount].verts[0];
        faces[faceCount].norms[1] = faces[faceCount].verts[1];
        faces[faceCount].norms[2] = faces[faceCount].verts[2];

        faces[faceCount].uvs[0] = faces[faceCount].verts[0];
        faces[faceCount].uvs[1] = faces[faceCount].verts[1];
        faces[faceCount].uvs[2] = faces[faceCount].verts[2];
        faces[faceCount].buckyIndex = 0;

        if (dowrap == 1)
        {
            c1 = (F32) i / (F32) BandsX2;
            c2 = (F32) (i + 1) / (F32) BandsX2;
            c0 = (c1 + 0.5f) / (F32) BandsX2;

            uvs[faces[faceCount].verts[0]].u = c0;
            uvs[faces[faceCount].verts[0]].v = r1;

            uvs[faces[faceCount].verts[1]].u = c1;
            uvs[faces[faceCount].verts[1]].v = r2;

            uvs[faces[faceCount].verts[2]].u = c2;
            uvs[faces[faceCount].verts[2]].v = r2;
        }
        else
        {
            uvs[faces[faceCount].verts[0]].u = 0.5f;
            uvs[faces[faceCount].verts[0]].v = 0.0f;

            uvs[faces[faceCount].verts[1]].u = 0.0f;
            uvs[faces[faceCount].verts[1]].v = 1.0f;

            uvs[faces[faceCount].verts[2]].u = 1.0f;
            uvs[faces[faceCount].verts[2]].v = 1.0f;
        }
    }

    // middle bands
    for (j = 0; j < bands - 2; j++)
    {
//		TopBandStartIndex = j * BandsX2 + 1;
//		BottomBandStartIndex = (j + 1) * BandsX2 + 1;
        TopBandStartIndex = j * (BandsX2 + 1) + 1;
        BottomBandStartIndex = (j + 1) * (BandsX2 + 1) + 1;
        r1 = (F32) (j + 1) / (F32) bands;
        r2 = (F32) (j + 2) / (F32) bands;
        for (i = 0; i < BandsX2; i++, faceCount += 2)
        {
            faces[faceCount].verts[0] = (WORD) (i + TopBandStartIndex);
//			faces[faceCount].verts[1] = ((i + 1) % BandsX2) + TopBandStartIndex;
//			faces[faceCount].verts[2] = ((i + 1) % BandsX2) + BottomBandStartIndex;
            faces[faceCount].verts[1] = (WORD) (((i + 1) % (BandsX2 + 1)) + TopBandStartIndex);
            faces[faceCount].verts[2] = (WORD) (((i + 1) % (BandsX2 + 1)) + BottomBandStartIndex);

            faces[faceCount].norms[0] = faces[faceCount].verts[0];
            faces[faceCount].norms[1] = faces[faceCount].verts[1];
            faces[faceCount].norms[2] = faces[faceCount].verts[2];

            faces[faceCount].uvs[0] = faces[faceCount].verts[0];
            faces[faceCount].uvs[1] = faces[faceCount].verts[1];
            faces[faceCount].uvs[2] = faces[faceCount].verts[2];
            faces[faceCount].buckyIndex = 0;

//			faces[faceCount+1].verts[0] = ((i + 1) % BandsX2) + BottomBandStartIndex;
            faces[faceCount+1].verts[0] = (WORD) (((i + 1) % (BandsX2 + 1)) + BottomBandStartIndex);
            faces[faceCount+1].verts[1] = (WORD) (i + BottomBandStartIndex);
            faces[faceCount+1].verts[2] = (WORD) (i + TopBandStartIndex);

            faces[faceCount+1].norms[0] = faces[faceCount+1].verts[0];
            faces[faceCount+1].norms[1] = faces[faceCount+1].verts[1];
            faces[faceCount+1].norms[2] = faces[faceCount+1].verts[2];

            faces[faceCount+1].uvs[0] = faces[faceCount+1].verts[0];
            faces[faceCount+1].uvs[1] = faces[faceCount+1].verts[1];
            faces[faceCount+1].uvs[2] = faces[faceCount+1].verts[2];
            faces[faceCount+1].buckyIndex = 0;

            if (dowrap == 1)
            {
                c1 = (F32) i / (F32) BandsX2;
                c2 = (F32) (i + 1) / (F32) BandsX2;

                uvs[faces[faceCount].verts[0]].u = c1;
                uvs[faces[faceCount].verts[0]].v = r1;

                uvs[faces[faceCount].verts[1]].u = c2;
                uvs[faces[faceCount].verts[1]].v = r1;

                uvs[faces[faceCount].verts[2]].u = c2;
                uvs[faces[faceCount].verts[2]].v = r2;

                uvs[faces[faceCount+1].verts[0]].u = c2;
                uvs[faces[faceCount+1].verts[0]].v = r2;

                uvs[faces[faceCount+1].verts[1]].u = c1;
                uvs[faces[faceCount+1].verts[1]].v = r2;

                uvs[faces[faceCount+1].verts[2]].u = c1;
                uvs[faces[faceCount+1].verts[2]].v = r1;
            }
            else
            {
                uvs[faces[faceCount].verts[0]].u = 1.0f;
                uvs[faces[faceCount].verts[0]].v = 0.0f;

                uvs[faces[faceCount].verts[1]].u = 0.0f;
                uvs[faces[faceCount].verts[1]].v = 0.0f;

                uvs[faces[faceCount].verts[2]].u = 0.0f;
                uvs[faces[faceCount].verts[2]].v = 1.0f;

                uvs[faces[faceCount+1].verts[0]].u = 0.0f;
                uvs[faces[faceCount+1].verts[0]].v = 1.0f;

                uvs[faces[faceCount+1].verts[1]].u = 1.0f;
                uvs[faces[faceCount+1].verts[1]].v = 1.0f;

                uvs[faces[faceCount+1].verts[2]].u = 1.0f;
                uvs[faces[faceCount+1].verts[2]].v = 0.0f;
            }
        }
    }

    // bottom band
//	LastBandStartIndex = BandsX2 * (bands - 2) + 1;
    LastBandStartIndex = (BandsX2 + 1) * (bands - 2) + 1;
    r1 = (F32) (bands - 1) / (F32) bands;
    r2 = 1.0f;
    for (i = 0; i < BandsX2; i++, faceCount++)
    {
        faces[faceCount].verts[0] = (WORD) LastIndex;
        faces[faceCount].verts[1] = (WORD) (LastBandStartIndex + i);
//		faces[faceCount].verts[2] = LastBandStartIndex + ((i + 1) % BandsX2);
        faces[faceCount].verts[2] = (WORD) (LastBandStartIndex + ((i + 1) % (BandsX2 + 1)));

        faces[faceCount].norms[0] = faces[faceCount].verts[0];
        faces[faceCount].norms[1] = faces[faceCount].verts[1];
        faces[faceCount].norms[2] = faces[faceCount].verts[2];

        faces[faceCount].uvs[0] = faces[faceCount].verts[0];
        faces[faceCount].uvs[1] = faces[faceCount].verts[1];
        faces[faceCount].uvs[2] = faces[faceCount].verts[2];
        faces[faceCount].buckyIndex = 0;

        if (dowrap == 1)
        {
            c1 = (F32) i / (F32) BandsX2;
            c2 = (F32) (i + 1) / (F32) BandsX2;
            c0 = c1 - 0.5f / (F32) BandsX2;

            uvs[faces[faceCount].verts[0]].u = c0;
            uvs[faces[faceCount].verts[0]].v = r2;

            uvs[faces[faceCount].verts[1]].u = c1;
            uvs[faces[faceCount].verts[1]].v = r1;

            uvs[faces[faceCount].verts[2]].u = c2;
            uvs[faces[faceCount].verts[2]].v = r1;
        }
        else
        {
            uvs[faces[faceCount].verts[0]].u = 0.5f;
            uvs[faces[faceCount].verts[0]].v = 0.0f;

            uvs[faces[faceCount].verts[1]].u = 0.0f;
            uvs[faces[faceCount].verts[1]].v = 1.0f;

            uvs[faces[faceCount].verts[2]].u = 1.0f;
            uvs[faces[faceCount].verts[2]].v = 1.0f;
        }
    }
    delete [] rads;

    root->Setup();

    // setup up face plane equations
    //
    root->SetupPlanes();

    if (!SetupRoot(*root, root->GetName()))
    {
        delete root;
        root = NULL;
    }
    return root;
}