//----------------------------------------------------------------------------
PX2::Movable *SceneBuilder::BuildGeometry (INode *maxNode, PX2::Node *relatParent, bool hasSkin)
{
	// 建立并且链接几何图形物体到场景
	// maxNode:
	//		Max场景中节点的指针
	// relatParent:
	//		当前新节点要绑定到的父亲节点

	// 如果Max“几何图形”节点没有孩子节点,直接在relatParent下添加几何图形。
	// 如果Max“几何图形”节点有孩子节点,会新建一个Node节点,将孩子几何图形节
	// 点添加到这个新建的Node节点下。

	PX2::Movable *child = 0;
	PX2::Node *link = 0;

	int numMaxChildren = maxNode->NumberOfChildren();
	for (int i=0; i<numMaxChildren; i++)
	{
		ObjectState objectState = maxNode->GetChildNode(i)
			->EvalWorldState(mTimeStart);
		if (objectState.obj->SuperClassID() == GEOMOBJECT_CLASS_ID ||
			objectState.obj->SuperClassID() == HELPER_CLASS_ID)
		{
			link = BuildNode(maxNode, relatParent);
			break;
		}
	}

	if (link == 0)
	{
		if (mSettings->IncludeMeshes && !maxNode->IsHidden())
		{
			child = BuildMesh(maxNode, relatParent, hasSkin);
		}
		else
		{
			child = BuildNode(maxNode, relatParent);
		}

		return child;
	}
	else
	{
		if (mSettings->IncludeMeshes && !maxNode->IsHidden())
		{
			child = BuildMesh(maxNode, link, hasSkin);
		}
		else
		{
			child = BuildNode(maxNode, link);
		}

		return link;
	}
}
Beispiel #2
0
//-----------------------------------------------------------------------------
// Purpose: Builds all navigation meshes
//-----------------------------------------------------------------------------
bool CRecastMgr::Build( bool loadDefaultMeshes )
{
	double fStartTime = Plat_FloatTime();

	// Load map mesh
	if( !LoadMapMesh() )
	{
		Warning("CRecastMesh::Build: failed to load map data!\n");
		return false;
	}

	// Insert all meshes first
	if( loadDefaultMeshes )
	{
		InitDefaultMeshes();
	}
	CUtlVector<CRecastMesh *> meshesToBuild;
	for ( int i = m_Meshes.First(); i != m_Meshes.InvalidIndex(); i = m_Meshes.Next(i ) )
	{
		if( IsMeshBuildDisabled( m_Meshes[i]->GetName() ) )
			continue;
		meshesToBuild.AddToTail( m_Meshes[i] );
	}

	// Create meshes
	if( recast_build_threaded.GetBool() )
	{
		// Build threaded
		CParallelProcessor<CRecastMesh *, CFuncJobItemProcessor<CRecastMesh *>, 2 > processor;
		processor.m_ItemProcessor.Init( &ThreadedBuildMesh, &PreThreadedBuildMesh, &PostThreadedBuildMesh );
		processor.Run( meshesToBuild.Base(), meshesToBuild.Count(), 1, recast_build_numthreads.GetInt(), g_pThreadPool );
	}
	else
	{
		if( V_strlen( recast_build_single.GetString() ) > 0 )
		{
			BuildMesh( m_pMapMesh, recast_build_single.GetString() );
		}
		else
		{
			for( int i = 0; i < meshesToBuild.Count(); i++ )
			{
				BuildMesh( m_pMapMesh, meshesToBuild[i]->GetName() );
			}
		}
	}

	m_bLoaded = true;
	DevMsg( "CRecastMgr: Finished generating %d meshes in %f seconds\n", m_Meshes.Count(), Plat_FloatTime() - fStartTime );
	return true;
}
Beispiel #3
0
void
TouchSensorObject::GetWorldBoundBox(TimeValue t, INode* inode, ViewExp* vpt,
                                   Box3& box )
{
    Matrix3 tm;
    BuildMesh(t);            // 000829  --prs.
    GetMat(t,inode,vpt,tm);

    BuildMesh(t);
    int nv = mesh.getNumVerts();
    box.Init();
    for (int i=0; i<nv; i++) 
        box += tm*mesh.getVert(i);
}
Beispiel #4
0
int
BackgroundObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags)
{
    float radius;
    pblock->GetValue(PB_BG_SIZE, t, radius, FOREVER);
    if (radius <= 0.0)
        return 0;
    BuildMesh(t);
    Matrix3 m;
    GraphicsWindow *gw = vpt->getGW();
    Material *mtl = gw->getMaterial();

    DWORD rlim = gw->getRndLimits();
    gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY|GW_BACKCULL);
    GetMat(t,inode,vpt,m);
    gw->setTransform(m);
    if (inode->Selected()) 
        gw->setColor( LINE_COLOR, 1.0f, 1.0f, 1.0f);
    else if(!inode->IsFrozen())
        gw->setColor( LINE_COLOR, 1.0f, 1.0f, 0.0f);
    mesh.render( gw, mtl, NULL, COMP_ALL);

    gw->setRndLimits(rlim);
    return(0);
}
Beispiel #5
0
int
FogObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags)
{
    if ( ! vpt || ! vpt->IsAlive() )
		{
			// why are we here?
			DbgAssert(!"Doing Display() on invalid view port!");
			return FALSE;
		}
		
		
		float radius;
    pblock->GetValue(PB_FOG_SIZE, t, radius, FOREVER);
    if (radius <= 0.0)
        return 0;
    BuildMesh(t);
    Matrix3 m;
    GraphicsWindow *gw = vpt->getGW();
    Material *mtl = gw->getMaterial();

    DWORD rlim = gw->getRndLimits();
    gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY|GW_BACKCULL| (rlim&GW_Z_BUFFER) );
    GetMat(t,inode,*vpt,m);
    gw->setTransform(m);
    if (inode->Selected()) 
        gw->setColor( LINE_COLOR, 1.0f, 1.0f, 1.0f);
    else if(!inode->IsFrozen())
        gw->setColor( LINE_COLOR, 1.0f, 0.0f, 0.0f);
    mesh.render( gw, mtl, NULL, COMP_ALL);

    gw->setRndLimits(rlim);
    return(0);
}
Beispiel #6
0
TargetObject::TargetObject() : GeomObject() {
	if (!meshBuilt) {
		BuildMesh();
		meshBuilt = 1;
		}

	}
Beispiel #7
0
void
Cal3DObject::GetLocalBoundBox(TimeValue t, INode *inode, ViewExp *vpt,
                              Box3 &box)
{
    BuildMesh(t); // 000829  --prs.
    box = mesh.getBoundingBox();
}
Beispiel #8
0
// The following methdos had to be redefined because Luminaires have 
// a different mesh than its base object
void LuminaireObject::UpdateMesh() 
{
	if (!(dumFlags&MESH_VALID)) 
	{
		BuildMesh();
		dumFlags |= MESH_VALID;
	}
}
Beispiel #9
0
void
SwitchObject::GetLocalBoundBox(TimeValue t, INode *inode, ViewExp *vpt,
                               Box3 &box)
{
    Matrix3 m = inode->GetObjectTM(t);
    BuildMesh(t);
    box = mesh.getBoundingBox();
}
Beispiel #10
0
ProtHelpObject::ProtHelpObject() : HelperObject() 
{
   editting = 0;
   created = 0;
   refNode[0] = refNode[1] = NULL;
   suspendSnap = FALSE;
   ivalid.SetEmpty();
   BuildMesh();
}
Beispiel #11
0
 //------------------------------------------------------------------------------
 void GLMesh::Restore() noexcept
 {
     if(m_vertexDataBackup && m_invalidData)
     {
         BuildMesh(m_vertexDataBackup.get(), m_vertexDataSize, m_indexDataBackup.get(), m_indexDataSize);
         
         m_invalidData = false;
     }
 }
Beispiel #12
0
void
NavInfoObject::GetLocalBoundBox(TimeValue t, INode* inode, ViewExp* /*vpt*/,
                                   Box3& box )
{
    BuildMesh(t);
    Matrix3 m = inode->GetObjectTM(t);
    box = mesh.getBoundingBox();

}
Beispiel #13
0
void
NavInfoObject::GetWorldBoundBox(TimeValue t, INode* inode, ViewExp* vpt,
                                   Box3& box )
{
    if ( ! vpt || ! vpt->IsAlive() )
		{
			// why are we here?
			box.Init();
			return;
		}
		
		Matrix3 tm;
    BuildMesh(t);            // 000829  --prs.
    GetMat(t,inode,*vpt,tm);

    BuildMesh(t);
    int nv = mesh.getNumVerts();
    box.Init();
    for (int i=0; i<nv; i++) 
        box += tm*mesh.getVert(i);
}
Beispiel #14
0
BombObject::BombObject()
	{
	pblock = NULL;
	ReplaceReference(0,CreateParameterBlock(descV2,10,BOMB_VERSION));	
	pblock->SetValue(PB_STRENGTH, TimeValue(0), 1.0f);
	pblock->SetValue(PB_GRAVITY, TimeValue(0), 1.0f);
	pblock->SetValue(PB_DETONATION, TimeValue(0), 800); 
	pblock->SetValue(PB_MINFRAG, TimeValue(0), 1); 
	pblock->SetValue(PB_MAXFRAG, TimeValue(0), 1); 
	pblock->SetValue(PB_FALLOFF, TimeValue(0), 100.0f); 
	BuildMesh(TimeValue(0),mesh);
	mesh.EnableEdgeList(1);
	}
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 void CSModelProvider::CreateResourceFromFile(StorageLocation in_location, const std::string& in_filePath, const IResourceOptionsBaseCSPtr& in_options, const ResourceSPtr& out_resource)
 {
     MeshSPtr meshResource = std::static_pointer_cast<Mesh>(out_resource);
     
     MeshDescriptor descriptor;
     
     if (ReadFile(in_location, in_filePath, descriptor) == false)
     {
         meshResource->SetLoadState(Resource::LoadState::k_failed);
         return;
     }
     
     BuildMesh(nullptr, descriptor, meshResource);
 }
Beispiel #16
0
 //------------------------------------------------------------------------------
 GLMesh::GLMesh(const u8* vertexData, u32 vertexDataSize, const u8* indexData, u32 indexDataSize, ChilliSource::RenderMesh* renderMesh) noexcept
     : m_vertexDataSize(vertexDataSize), m_indexDataSize(indexDataSize), m_renderMesh(renderMesh)
 {
     BuildMesh(vertexData, vertexDataSize, indexData, indexDataSize);
     
     if(k_shouldBackupMeshDataFromMemory && renderMesh->ShouldBackupData())
     {
         u8* vertextDataCopy = new u8[vertexDataSize];
         memcpy(vertextDataCopy, vertexData, vertexDataSize);
         m_vertexDataBackup = std::unique_ptr<const u8[]>(vertextDataCopy);
         
         u8* indexDataCopy = new u8[indexDataSize];
         memcpy(indexDataCopy, indexData, indexDataSize);
         m_indexDataBackup = std::unique_ptr<const u8[]>(indexDataCopy);
     }
 }
Beispiel #17
0
//+-----------------------------------------------------------------------------
//| Renders the geoset
//+-----------------------------------------------------------------------------
VOID MODEL_GEOSET::Render(CONST SEQUENCE_TIME& time, BOOL Animated)
{
	BuildMesh();
	glUseProgram(Graphics.Program());

	ESMatrix modelviewMatrix;
	ESMatrix perspectiveMatrix;
	ESMatrix mvpMatrix;

	int aspect;

	aspect = (GLfloat) 600 / (GLfloat) 800;
	esMatrixLoadIdentity(&perspectiveMatrix);
	esPerspective(&perspectiveMatrix, 60.0f, aspect, 1.0f, 20.0f);

	esMatrixLoadIdentity(&modelviewMatrix);
	esScale(&modelviewMatrix, 1.0f, 1.0f, 1.0f);
	esTranslate(&modelviewMatrix, 0.0f, 0.0f, 0.0f);

	static float angle = 0.0f;
	esRotate(&modelviewMatrix,angle, 1.0f, 0.0f, 0.0f);
	angle += 0.2f;

	esMatrixLoadIdentity(&mvpMatrix);
	esMatrixMultiply(&mvpMatrix, &modelviewMatrix, &perspectiveMatrix);
	glUniformMatrix4fv(Graphics.WVPMatrix(), 1, GL_FALSE, (GLfloat*) mvpMatrix.m);

	glEnable(GL_TEXTURE_2D);
	glEnable(GL_TEXTURE0);

	glActiveTexture(GL_TEXTURE0);
	glEnableVertexAttribArray(Graphics.Position());
	glEnableVertexAttribArray(Graphics.TexturePosition());
	
	glUniform1i(Graphics.Texture(), 0);

	glVertexAttribPointer(Graphics.Position(), 3, GL_FLOAT, GL_FALSE, sizeof(FLOAT) * 3, vertices);
	glVertexAttribPointer(Graphics.TexturePosition(), 2, GL_FLOAT, GL_FALSE, 2 * sizeof(FLOAT), TexturePositions);
	glDrawElements(GL_TRIANGLES, GeosetData.FaceContainer.GetTotalSize() * 3, GL_UNSIGNED_INT, indices);
	
	glDisable(GL_TEXTURE_2D);
	glDisable(GL_TEXTURE0);
	glDisableVertexAttribArray(Graphics.TexturePosition());
	glDisableVertexAttribArray(Graphics.Texture());
}
Beispiel #18
0
TapeHelpObject::TapeHelpObject() : HelperObject()
{
    ParamBlockDesc desc[] = {
        { TYPE_FLOAT, NULL, TRUE }
    };

    // RB: Need to make a reference to the parameter block!
    pblock = NULL;
    ReplaceReference( 0, CreateParameterBlock( desc, 1 ));

    enable = 0;
    editting = 0;
    lastDist = 0.0f;
    SetLength( TimeValue(0), dlgLength );
    specLenState = dlgSpecLen;
    BuildMesh();
    dirPt.x = dirPt.y = dirPt.z = 0.0f;
}
 //----------------------------------------------------------------------------
 //----------------------------------------------------------------------------
 void CSModelProvider::LoadMeshDataTask(StorageLocation in_location, const std::string& in_filePath, const AsyncLoadDelegate& in_delegate, const MeshSPtr& out_resource)
 {
     //read the mesh data into a MoStaticDeclaration
     MeshDescriptor descriptor;
     if (false == ReadFile(in_location, in_filePath, descriptor))
     {
         out_resource->SetLoadState(Resource::LoadState::k_failed);
         Application::Get()->GetTaskScheduler()->ScheduleTask(TaskType::k_mainThread, [=](const TaskContext&) noexcept
         {
             in_delegate(out_resource);
         });
     }
     
     //start a main thread task for loading the data into a mesh
     Application::Get()->GetTaskScheduler()->ScheduleTask(TaskType::k_large, [=](const TaskContext&) noexcept
     {
         BuildMesh(in_delegate, descriptor, out_resource);
     });
 }
BOOL CoGXEventTrigger::Initialize(CoExecutive* pExecutive,GXSchedulePROC pProc,DWORD dwFlag)
{
	CGXMapObject::Cleanup();
	m_pExecutive = pExecutive;
	m_EventTriggerDesc.dwColor = 0xffffffff;
	SET_VECTOR3(&m_EventTriggerDesc.v3Pos,0.0f);
	SET_VECTOR3(&m_EventTriggerDesc.v3Rot,0.0f);
	SET_VECTOR3(&m_EventTriggerDesc.v3Scale,1.0f);
	SET_VECTOR3(&m_v3DefaultLength,100.0f);
	BuildMesh();

	m_dwID = 0xfffffff4;
	m_pHashHandle = NULL;
	m_dwPropertyFlag = dwFlag;
	m_dwObjectType = GX_MAP_OBJECT_TYPE_TRIGGER;

	m_pProc	=	pProc;

	return TRUE;
}
Beispiel #21
0
int
Cal3DObject::Display(TimeValue t, INode *inode, ViewExp *vpt, int flags)
{
    pblock->GetValue(PB_CAL_SIZE, t, scale, FOREVER);
    if (scale <= 0.0)
        return 0;
    BuildMesh(t);
    Matrix3 m;
    GraphicsWindow *gw = vpt->getGW();
    Material *mtl = gw->getMaterial();

    DWORD rlim = gw->getRndLimits();
    gw->setRndLimits(/*GW_WIREFRAME*/ GW_ILLUM | GW_FLAT | GW_Z_BUFFER | GW_BACKCULL);
    GetMat(t, inode, vpt, m);
    gw->setTransform(m);
    if (inode->Selected())
        gw->setColor(LINE_COLOR, 1.0f, 1.0f, 1.0f);
    else if (!inode->IsFrozen())
        gw->setColor(LINE_COLOR, 0.0f, 1.0f, 0.0f);
    mesh.render(gw, mtl, NULL, COMP_ALL);
    gw->setRndLimits(rlim);
    return (0);
}
Beispiel #22
0
void MeshExporter::Export()
{
	mRoot = new Root;
	mResourceManager = new ResourceManager;
	mRenderSystem = new NullRenderSystem;
	mWorld = new World;

	try 
	{
		IGameConversionManager* cm = GetConversionManager();
		cm->SetCoordSystem(IGameConversionManager::IGAME_D3D);
		mGameScene->InitialiseIGame(ExportConfig::Instance()->IsExportSelected());
		mGameScene->SetStaticFrame(0);

		int nodeCount = mGameScene->GetTopLevelNodeCount();
		if (nodeCount == 0)
		{
			MessageBox(GetActiveWindow(), "No nodes available!", "Error", MB_OK);
			goto __end;
		}

		mMeshSource = MeshManager::Instance()->NewMesh("MaxExporter");

		// extract skeleton
		for (int i = 0; i < nodeCount; ++i)
		{
			IGameNode* node = mGameScene->GetTopLevelNode(i);

			if (node->IsNodeHidden())
				continue ;

			ExtractSkeleton(node);
		}

		// extract mesh
		mMeshData.Clear();

		for (int i = 0; i < nodeCount; ++i)
		{
			IGameNode* node = mGameScene->GetTopLevelNode(i);

			if (node->IsNodeHidden())
				continue ;

			ExtractMesh(node);
		}

		if (mMMPairs.Size() == 0)
		{
			MessageBox(GetActiveWindow(), "No Objects!", "Error", MB_OK);
			goto __end;
		}

		BuildMesh();

		// save mesh
		MeshSerializer::Save(mMeshSource.c_ptr(), ExportConfig::Instance()->GetExportFilename());

		MessageBox(GetActiveWindow(), "Export OK!", "Info", MB_ICONINFORMATION);
	}
	catch (...) 
	{
		MessageBox(GetActiveWindow(), "Error!", "Error", MB_ICONEXCLAMATION);
	}

__end:
	mMeshSource = NULL;

	delete mWorld;
	delete mRenderSystem;
	delete mResourceManager;
	delete mRoot;
}
Beispiel #23
0
void SimpleObject::UpdateMesh(TimeValue t) 
	{
	if (!ivalid.InInterval(t) ) {
		BuildMesh(t);
		}
	}
void CoGXEventTrigger::SetScale(VECTOR3* pv3Scale)
{
	m_EventTriggerDesc.v3Scale = *pv3Scale;
	BuildMesh();
}
void CoGXEventTrigger::SetRotation(VECTOR3* pv3Rot)
{
	m_EventTriggerDesc.v3Rot = *pv3Rot;
	BuildMesh();
}
	Mesh::Mesh(const char* objName) : Object(){
		built = false;

		BuildMesh(objName);
	}
osg::Geode* BuildMesh(const TopoDS_Face &face, const osg::Vec4 &color, double deflection)
{
	osg::ref_ptr<osg::Geode> geode = new osg::Geode();
	BuildMesh(geode, face, color, deflection);
	return geode.release();
}
void CoGXEventTrigger::SetPosition(VECTOR3* pv3Pos)
{
	m_EventTriggerDesc.v3Pos = *pv3Pos;
	BuildMesh();
}