⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch3dtrvs.cpp

📁 Windows上的MUD客户端程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
}
//#define ANNOUNCE(className) announce(QV__QUOTE(className))
#define ANNOUNCE(className) 

#define DEFAULT_TRAVERSE(className)					      \
void									      \
className::traverse(QvState *state)						      \
{									      \
    ANNOUNCE(className);						      \
	QueryNode(this, state);					\
	if(!m_pRenderData) m_pRenderData = new ChQvRenderBaseData(this); \
}

//////////////////////////////////////////////////////////////////////////////
//
// Groups.
//
//////////////////////////////////////////////////////////////////////////////

void
QvGroup::traverse(QvState *state)
{
    ANNOUNCE(QvGroup);
	if( ((ChQvState*)state)->GetType() ==  ChQvState::buildInstance)
	{	
		ChQvBuildState *bldState = (ChQvBuildState*)state;
		if(!m_pRenderData) m_pRenderData = new ChQvRenderBaseData(this);
		ChQvRenderBaseData *pRenderData =  (ChQvRenderBaseData *)m_pRenderData;
		ChQvGroupInstance *pInstance = new ChQvGroupInstance;
		pInstance->Attach(this, bldState);
		ChQvGroupInstance *pParent =	bldState->GetCurrentParent();
		
		bldState->SetCurrentParent(pInstance);
		 
		ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
		//#define DONT_PUSH	1
		#if defined(DONT_PUSH)
		pRC->PushTransform();

	    state->push();
		#endif

	    indent++;
	    for (int i = 0; i < getNumChildren(); i++)
			getChild(i)->traverse(state);
	    indent--;

		#if defined(DONT_PUSH)
	    state->pop();

		pRC->PopTransform();
		#endif

		if(pParent) bldState->SetCurrentParent(pParent);

	}	
	else
	{
		QueryNode(this, state);
	    indent++;
	    for (int i = 0; i < getNumChildren(); i++)
		getChild(i)->traverse(state);
	    indent--;
	}
}


void
QvLOD::traverse(QvState *state)
{
    ANNOUNCE(QvLOD);
	if( ((ChQvState*)state)->GetType() ==  ChQvState::buildInstance)
	{	

		ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
		pRC->PushTransform();

	    state->push();

		ChQvBuildState *bldState = (ChQvBuildState*)state;
		if(!m_pRenderData) m_pRenderData = new ChQvRenderBaseData(this);
		ChQvRenderBaseData *pRenderData =  (ChQvRenderBaseData *)m_pRenderData;
		ChQvLODInstance *pInstance = new ChQvLODInstance;
		pInstance->Attach(this, bldState);
		ChQvGroupInstance *pParent =	bldState->GetCurrentParent();
		bldState->SetCurrentParent(pInstance);
		 
	    indent++;
		// Removed 1/24/96 jwd to postpone instatntiation and spawning until
		// first rendering of lod
		#if 0
	    for (int i = 0; i < getNumChildren(); i++)
			getChild(i)->traverse(state);
	    #endif
	    indent--;
	    state->pop();

		pRC->PopTransform();
		
		//pInstance->SetUpKids();

		if(pParent) bldState->SetCurrentParent(pParent);

	}	
	else if( ((ChQvState*)state)->GetType() == ChQvState::spawnRequests)
	{
		// Spawn for all kids, regardless of range
	    indent++;
		// Removed 1/24/96 jwd to postpone instatntiation and spawning until
		// first rendering of lod
		#if 0
	    for (int i = 0; i < getNumChildren(); i++)
		{
			getChild(i)->traverse(state);
		}
	    #endif
	    indent--;
	}
	else
	{
	    indent++;

	    // ??? 
	    if (getNumChildren() > 0)
		{
			int iChild = -1;

			QueryNode(this, state);
	
			// Lookup in range array
			iChild = 0;

			// Traverse the chosen one
			if (getNumChildren() > 0) getChild(iChild)->traverse(state);
		}
		//getChild(0)->traverse(state);

	    indent--;
	}
}

void
QvSeparator::traverse(QvState *state)
{
    ANNOUNCE(QvSeparator);

	if( ((ChQvState*)state)->GetType() ==  ChQvState::buildInstance)
	{	
		ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
		pRC->PushTransform();

	    state->push();

		ChQvBuildState *bldState = (ChQvBuildState*)state;
		if(!m_pRenderData) m_pRenderData = new ChQvGroupRenderData(this);
		ChQvGroupRenderData *pRenderData =  (ChQvGroupRenderData *)m_pRenderData;
		ChQvSeparatorInstance *pInstance = new ChQvSeparatorInstance;
		pInstance->Attach(this, bldState);
		ChQvGroupInstance *pParent =	bldState->GetCurrentParent();
		bldState->SetCurrentParent(pInstance);
		 
	    indent++;
	    for (int i = 0; i < getNumChildren(); i++)
			getChild(i)->traverse(state);
	    indent--;
	    state->pop();

		pRC->PopTransform();

		if(pParent) bldState->SetCurrentParent(pParent);

	}	
	else
	{
	    state->push();

		if( ((ChQvState*)state)->GetType() ==  ChQvState::draw)
		{
			ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
			pRC->PushTransform();
		}	

		QueryNode(this, state);
    
	    indent++;
	    for (int i = 0; i < getNumChildren(); i++)
		getChild(i)->traverse(state);
	    indent--;
	    state->pop();
	
		if( ((ChQvState*)state)->GetType() ==  ChQvState::draw)
		{
			ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
			pRC->PopTransform();
		}
	}	
}

void
QvSpinGroup::traverse(QvState *state)
{
    ANNOUNCE(QvSpinGroup);

	if( ((ChQvState*)state)->GetType() ==  ChQvState::buildInstance)
	{	
		ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
		pRC->PushTransform();

	    state->push();

		ChQvBuildState *bldState = (ChQvBuildState*)state;
		if(!m_pRenderData) m_pRenderData = new ChQvSpinGroupRenderData(this);
		ChQvSpinGroupRenderData *pRenderData =  (ChQvSpinGroupRenderData *)m_pRenderData;
		ChQvSpinGroupInstance *pInstance = new ChQvSpinGroupInstance;
		pInstance->Attach(this, bldState);
		ChQvGroupInstance *pParent =	bldState->GetCurrentParent();
		bldState->SetCurrentParent(pInstance);
		 
		#if 0
		// Add the group's transform instance onto the stack
		ChQvElement *elt = new ChQvElement;					      
		elt->data = this;							      
		elt->type = QvElement::Transform;					      
		state->addElement(QvState::TransformationIndex, elt);
		ChQvTransformationInstance *pTransformInstance = pInstance->GetTransformInstance();
		pTransformInstance->Attach(this, bldState);
		
		GxTransform3Wf mat;
		pTransformInstance->SetSelfTransform(mat);

		elt->SetInstance(pTransformInstance);
		#endif

	    indent++;
	    for (int i = 0; i < getNumChildren(); i++)
			getChild(i)->traverse(state);
	    indent--;
	    state->pop();

		pRC->PopTransform();

		if(pParent) bldState->SetCurrentParent(pParent);

	}	
	else
	{
	    state->push();

		if( ((ChQvState*)state)->GetType() ==  ChQvState::draw)
		{
			ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
			pRC->PushTransform();
		}	

		QueryNode(this, state);
    
	    indent++;
	    for (int i = 0; i < getNumChildren(); i++)
		getChild(i)->traverse(state);
	    indent--;
	    state->pop();
	
		if( ((ChQvState*)state)->GetType() ==  ChQvState::draw)
		{
			ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
			pRC->PopTransform();
		}
	}	
}

void
QvSwitch::traverse(QvState *state)
{
    ANNOUNCE(QvSwitch);
  	//DEFAULT_QUERYNODE(this, state);	
 	DoNodeEditCommand(this, state);

	if( ((ChQvState*)state)->GetType() ==  ChQvState::buildInstance)
	{	
		ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
		pRC->PushTransform();
	    state->push();

		ChQvBuildState *bldState = (ChQvBuildState*)state;
		if(!m_pRenderData) m_pRenderData = new ChQvSwitchRenderData(this);
		ChQvSwitchRenderData *pRenderData =  (ChQvSwitchRenderData *)m_pRenderData;
		ChQvSwitchInstance *pInstance = new ChQvSwitchInstance;
		pInstance->Attach(this, bldState);
		ChQvGroupInstance *pParent =	bldState->GetCurrentParent();
		bldState->SetCurrentParent(pInstance);
		 
	    indent++;
		#if defined(CH_USE_3DR)
	    for (int i = 0; i < getNumChildren(); i++)
			getChild(i)->traverse(state);
		#elif (defined(CH_USE_RLAB) || defined(CH_USE_D3D))
		// Traverse just the one - ignore all others forever - needs to be changed for Pueblo
	    int which = whichChild.value;
		if(getName() == "Cameras")
		{
		
			for (int i = 0; i < getNumChildren(); i++)
			{
				string strType;
				QvNode *pChild = getChild(i);
				if( pChild->GetType(strType) == typeQvPerspectiveCamera || 
					pChild->GetType(strType) == typeQvOrthographicCamera ||
					i == which)
				{
		    		pChild->traverse(state);
				}
			}
		}
		else
		{
		    if (which == QV_SWITCH_NONE)
			{
				;
			}
		    else if (which == QV_SWITCH_ALL)
			{
				for (int i = 0; i < getNumChildren(); i++)
				{
			    	getChild(i)->traverse(state);
				}
			}
		    else
			{
				#if !defined(CH_VRML_VIEWER) && !defined(CH_VRML_PLUGIN )
									// Instantiate them all for Pueblo - can be reselected
				for (int i = 0; i < getNumChildren(); i++)
				{
			    	getChild(i)->traverse(state);
				}
				#else
												// VRML 1.0 is not modifiable outside of
												// Pueblo, so just instantiate the whichChild one
											   // Other negatives are bad; ignore them
				if (which >= 0 && which < getNumChildren())
				{
				    getChild(which)->traverse(state);
				}
				#endif
			}
		}
		#else
		#pragma message("Switch traversal not done")
		#endif
	    indent--;
	    state->pop();

		pRC->PopTransform();

		if(pParent) bldState->SetCurrentParent(pParent);

	}	
	else
	{
		QueryNode(this, state);
	    indent++;
	    int which = whichChild.value;

	    if (which == QV_SWITCH_NONE)
		{
			;
		}
	    else if (which == QV_SWITCH_ALL)
		{
			for (int i = 0; i < getNumChildren(); i++)
			{
		    	getChild(i)->traverse(state);
			}
		}
	    else
		{							   // other negatives are bad; ignore
			if (which >= 0 && which < getNumChildren())
			{
			    getChild(which)->traverse(state);
			}
		}

	    indent--;
	}
}

void
QvTransformSeparator::traverse(QvState *state)
{
    ANNOUNCE(QvTransformSeparator);

	if( ((ChQvState*)state)->GetType() ==  ChQvState::buildInstance)
	{	
		ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
		pRC->PushTransform();

	    state->push();

		ChQvBuildState *bldState = (ChQvBuildState*)state;
		if(!m_pRenderData) m_pRenderData = new ChQvRenderBaseData(this);
		ChQvRenderBaseData *pRenderData =  (ChQvRenderBaseData *)m_pRenderData;
		ChQvTransformSeparatorInstance *pInstance = new ChQvTransformSeparatorInstance;
		pInstance->Attach(this, bldState);
		ChQvGroupInstance *pParent =	bldState->GetCurrentParent();
		bldState->SetCurrentParent(pInstance);
		 
	    indent++;
	    for (int i = 0; i < getNumChildren(); i++)
			getChild(i)->traverse(state);
	    indent--;
	    state->pop();

		pRC->PopTransform();

		if(pParent) bldState->SetCurrentParent(pParent);

	}	
	else
	{
	    // We need to "push" just the transformation stack. We'll
	    // accomplish this by just pushing a no-op transformation onto
	    // that stack. When we "pop", we'll restore that stack to its
	    // previous state.

	    QvElement *markerElt = new QvElement;
	    markerElt->data = this;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -