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

📄 ch3dtrvs.cpp

📁 Windows上的MUD客户端程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	    markerElt->type = QvElement::NoOpTransform;
	    state->addElement(QvState::TransformationIndex, markerElt);

		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--;

	    // Now do the "pop"
	    while (state->getTopElement(QvState::TransformationIndex) != markerElt)
		state->popElement(QvState::TransformationIndex);
	
		if( ((ChQvState*)state)->GetType() ==  ChQvState::draw)
		{
			ChRenderContext *pRC = ((ChQvState*)state)->GetView()->GetRenderContext();
			pRC->PopTransform();
		}
	}	
}

//////////////////////////////////////////////////////////////////////////////
//
// Properties.
//
//////////////////////////////////////////////////////////////////////////////

#define DO_PROPERTY(className, stackIndex)				      \
void									      \
className::traverse(QvState *state)					      \
{									      \
    ANNOUNCE(className);						      \
	DEFAULT_QUERYNODE(this, state);	\
    QvElement *elt = new QvElement;					      \
    elt->data = this;							      \
    state->addElement(QvState::stackIndex, elt);			      \
	if(!m_pRenderData) m_pRenderData = new ChQvRenderBaseData(this);	\
}

#define DO_TYPED_PROPERTY(className, stackIndex, eltType)		      \
void									      \
className::traverse(QvState *state)					      \
{									      \
    ANNOUNCE(className);						      \
	DEFAULT_QUERYNODE(this, state);	\
	/*DoNodeEditCommand(this, state);*/						\
    QvElement *elt = new QvElement;					      \
    elt->data = this;							      \
    elt->type = QvElement::eltType;					      \
    state->addElement(QvState::stackIndex, elt);			      \
	if(!m_pRenderData) m_pRenderData = new ChQvRenderBaseData(this);	\
}

DO_PROPERTY(QvCoordinate3,			Coordinate3Index)
DO_PROPERTY(QvMaterialBinding,		MaterialBindingIndex)
DO_PROPERTY(QvNormal,				NormalIndex)
DO_PROPERTY(QvNormalBinding,		NormalBindingIndex)
DO_PROPERTY(QvTextureCoordinate2,	TextureCoordinate2Index)
DO_PROPERTY(QvFontStyle,			FontStyleIndex)

void									      
QvTexture2::traverse(QvState *state)					      
{	
	DEFAULT_QUERYNODE(this, state);
	ChQvTextureRenderData *pRenderData;
	if(!m_pRenderData)
	{
		m_pRenderData = pRenderData = new ChQvTextureRenderData(this);
	}
	else {
		pRenderData =  (ChQvTextureRenderData *)m_pRenderData;
	}
	if (pRenderData->GetURL(state)) return;								      

    QvElement *elt = new QvElement;					      
    elt->data = this;							      
    state->addElement(QvState::Texture2Index, elt);

	if( ((ChQvState*)state)->GetType() ==  ChQvState::draw)
	{
	}
	else if( ((ChQvState*)state)->GetType() ==  ChQvState::command)
	{
	}			
}

//DO_PROPERTY(QvTexture2Transform,	Texture2TransformationIndex)
void									      
QvTexture2Transform::traverse(QvState *state)					      
{	
	DEFAULT_QUERYNODE(this, state);
	ChQvTexture2TransformRenderData *pRenderData;
	if(!m_pRenderData)
	{
		m_pRenderData = pRenderData = new ChQvTexture2TransformRenderData(this);
	}
	else {
		pRenderData =  (ChQvTexture2TransformRenderData *)m_pRenderData;
	}

    QvElement *elt = new QvElement;					      
    elt->data = this;							      
    state->addElement(QvState::Texture2TransformationIndex, elt);

	if( ((ChQvState*)state)->GetType() ==  ChQvState::draw)
	{
	}
	else if( ((ChQvState*)state)->GetType() ==  ChQvState::command)
	{
	}			
}

void									      
QvDirectionalLight::traverse(QvState *state)					      
{									      
    ANNOUNCE(className);						      
	DEFAULT_QUERYNODE(this, state);	
    QvElement *elt = new QvElement;					      
    elt->data = this;							      
    elt->type = QvElement::DirectionalLight;					      
    state->addElement(QvState::LightIndex, elt);

	int wLightNum = ((ChQvState*)state)->NextLight();	  

	if( ((ChQvState*)state)->GetType() ==  ChQvState::buildInstance)
	{	
		ChQvBuildState *bldState = (ChQvBuildState*)state;
		if(!m_pRenderData) m_pRenderData = new ChQvRenderBaseData(this);
		ChQvRenderBaseData *pRenderData =  (ChQvRenderBaseData *)m_pRenderData;
		ChQvDirectionalLightInstance *pInstance = new ChQvDirectionalLightInstance;
		pInstance->Attach(this, bldState);
	}	
	else if( ((ChQvState*)state)->GetType() ==  ChQvState::draw)
	{
		#if defined(CH_USE_3DR)
		// TODO figure out if this is dead code for 3dr too
		G3dHandle_t hGC = ((ChQvState*)state)->GetView()->GetGC();
	  

		// We don't have directional lights in 3dr, so put a spot light very far away,
		// and leave it wide open angle-wise, with no attenuation
		if(wLightNum < G3D_MAX_LIGHTS)
		{
			Float_t		dimmer = 	int(on.value) ? 1. : 0.;
			float fIntensity = intensity.value;
			fIntensity = min(fIntensity, 1.);
			fIntensity = max(fIntensity, 0.);
			ColorFA_t	diffuse;		Qv2Native(color, diffuse);
			ColorF_t	specular;		Qv2Native(color,specular) ;


			// Transform light from model (vrml) to world coords for 3dr
			PointF_t	dir;		Qv2Native(direction,dir);
			PointFW_t	tmp;		
			GxTransformF_t mat;
			G3dSetActiveStack(hGC, G3DT_MODEL);
			G3dGetTransform(hGC,  mat);
			G3dTransformPointF( &dir, &tmp, mat );
			CopyPoint(tmp, dir);

			Float_t		infinity	=	1.e6;	// close enough (or far enough) for us
			PointFW_t	loc;
			loc.x = -dir.x * infinity;
			loc.y = -dir.y * infinity;
			loc.z = -dir.z * infinity;
			loc.w = 0.;				 // infinite light
	 		ColorF_t	ambient = {0.,0.,0.};
													 
			Float_t exponent	= 0.00;	   // no fall off
			Float_t angle		= 1.57;	   // leave the barn doors open
			Float_t attena 		= 1.00;	   // no attenuation
			Float_t attenb 		= 0.00;
			Float_t attenc 		= 0.00;

			specular.r *= fIntensity;
			specular.g *= fIntensity;
			specular.b *= fIntensity;

			diffuse.r *= fIntensity;
			diffuse.g *= fIntensity;
			diffuse.b *= fIntensity;


			G3dSetLight( hGC, wLightNum, G3DL_DIMMER,   	(Float_t *)&dimmer );			
			G3dSetLight( hGC, wLightNum, G3DL_AMBIENT, 		(Float_t *)&ambient );			
			G3dSetLight( hGC, wLightNum, G3DL_DIFFUSE,  	(Float_t *)&diffuse );			
			G3dSetLight( hGC, wLightNum, G3DL_SPECULAR, 	(Float_t *)&specular );			
			G3dSetLight( hGC, wLightNum, G3DL_DIRECTION,	(Float_t *)&dir );			
			G3dSetLight( hGC, wLightNum, G3DL_LOCATION,		(Float_t *)&loc );
			G3dSetLight( hGC, wLightNum, G3DL_ATTENA,  		(Float_t *)&attena );
			G3dSetLight( hGC, wLightNum, G3DL_ATTENB,  		(Float_t *)&attenb );
			G3dSetLight( hGC, wLightNum, G3DL_ATTENC,  		(Float_t *)&attenc );
			G3dSetLight( hGC, wLightNum, G3DL_SPOT_EXP, 	(Float_t *)&exponent );
			G3dSetLight( hGC, wLightNum, G3DL_SPOT_ANGLE,	(Float_t *)&angle );
		}
		#endif			
	}
	else if( ((ChQvState*)state)->GetType() ==  ChQvState::command)
	{
		if(!((ChQvState*)state)->GetCmd().CompareNoCase("light"))	 // hard coded yucko!!
		{
			if(((ChQvState*)state)->GetIData() == wLightNum-1)		 // oughta use keys
			{
				intensity.value = ((ChQvState*)state)->GetFData();
				intensity.value = max(intensity.value, 0.);
				intensity.value = min(intensity.value, 1.);
			}
		}
	}
	else if( ((ChQvState*)state)->GetType() ==  ChQvState::findGlobals)
	{
		ChQvGlobalSearchState *srchState = (ChQvGlobalSearchState*)state; 

		if( on.value > 0.) srchState->SetLightOn( );
	}
			

}


void									      
QvPointLight::traverse(QvState *state)					      
{									      
    ANNOUNCE(className);						      
	DEFAULT_QUERYNODE(this, state);	
    QvElement *elt = new QvElement;					      
    elt->data = this;							      
    elt->type = QvElement::PointLight;					      
    state->addElement(QvState::LightIndex, elt);

	int wLightNum = ((ChQvState*)state)->NextLight();	  

	if( ((ChQvState*)state)->GetType() ==  ChQvState::buildInstance)
	{	
		ChQvBuildState *bldState = (ChQvBuildState*)state;
		if(!m_pRenderData) m_pRenderData = new ChQvRenderBaseData(this);
		ChQvRenderBaseData *pRenderData =  (ChQvRenderBaseData *)m_pRenderData;
		ChQvPointLightInstance *pInstance = new ChQvPointLightInstance;
		pInstance->Attach(this, bldState);
	}	
	else if( ((ChQvState*)state)->GetType() ==  ChQvState::draw)
	{
		#if defined(CH_USE_3DR)
		G3dHandle_t hGC = ((ChQvState*)state)->GetView()->GetGC();
	  
		if(wLightNum < G3D_MAX_LIGHTS)
		{
			Float_t		dimmer = 	int(on.value) ? 1. : 0.;
			float fIntensity = intensity.value;
			fIntensity = min(fIntensity, 1.);
			fIntensity = max(fIntensity, 0.);

			ColorFA_t	diffuse;	Qv2Native(color, diffuse);
			ColorF_t	specular;	Qv2Native(color,specular) ;
			PointF_t	dir = {0., 0., 0.};	  // not a spot
	 		ColorF_t	ambient = {0.,0.,0.};

			// Transform light from model (vrml) to world coords for 3dr
			PointF_t	locV;		Qv2Native(location,locV);
			PointFW_t	loc;		
			GxTransformF_t mat;
			G3dSetActiveStack(hGC, G3DT_MODEL);
			G3dGetTransform(hGC,  mat);
			G3dTransformPointF( &locV, &loc, mat );
			loc.w = 1.;				 // noninfinite light
			
			 
			static int j = 0;
			static Float_t attena = 1.0;
			static Float_t attenb = 0.0;
			static Float_t attenc = 0.0;
			//static Float_t attenb = .0075;
			//static Float_t attenc = .0075;

			//test effect of dimming
			//if (wLightNum == 5) fIntensity /= 5;
			//if (wLightNum == 7) fIntensity = 1;

			specular.r *= fIntensity;
			specular.g *= fIntensity;
			specular.b *= fIntensity;

			diffuse.r *= fIntensity;
			diffuse.g *= fIntensity;
			diffuse.b *= fIntensity;


			G3dSetLight( hGC,  wLightNum, G3DL_DIMMER,    	(Float_t *)&dimmer     );			
			G3dSetLight( hGC,  wLightNum, G3DL_AMBIENT, 	(Float_t *)&ambient  );			
			G3dSetLight( hGC,  wLightNum, G3DL_DIFFUSE,  	(Float_t *)&diffuse   );			
			G3dSetLight( hGC,  wLightNum, G3DL_SPECULAR, 	(Float_t *)&specular  );			
			G3dSetLight( hGC,  wLightNum, G3DL_DIRECTION,  (Float_t *)&dir  );			
			G3dSetLight( hGC,  wLightNum, G3DL_LOCATION,  (Float_t *)&loc  );
			//G3dSetLight( hGC,  wLightNum, G3DL_ATTENA,  (Float_t *)&attena  );
			G3dSetLight( hGC,  wLightNum, G3DL_ATTENB,  (Float_t *)&attenb  );
			G3dSetLight( hGC,  wLightNum, G3DL_ATTENC,  (Float_t *)&attenc  );
		}			
		#endif
	}
	else if( ((ChQvState*)state)->GetType() ==  ChQvState::command)
	{
		if(!((ChQvState*)state)->GetCmd().CompareNoCase("light"))	 // hard coded yucko!!
		{
			if(((ChQvState*)state)->GetIData() == wLightNum-1)		 // oughta use keys
			{
				intensity.value = ((ChQvState*)state)->GetFData();
				intensity.value = max(intensity.value, 0.);
				intensity.value = min(intensity.value, 1.);
			}
		}
	}			
	else if( ((ChQvState*)state)->GetType() ==  ChQvState::findGlobals)
	{
		ChQvGlobalSearchState *srchState = (ChQvGlobalSearchState*)state; 

		if( on.value > 0.) srchState->SetLightOn( );
	}

}




void									      
QvSpotLight::traverse(QvState *state)					      
{									      
    ANNOUNCE(className);						      
 	DEFAULT_QUERYNODE(this, state);	
	//DoNodeEditCommand(this, state);
 		
 	QvElement *elt = new QvElement;					      
    elt->data = this;							      
    elt->type = QvElement::SpotLight;					    
    state->addElement(QvState::LightIndex, elt);

	int wLightNum = ((ChQvState*)state)->NextLight();	  

	if( ((ChQvState*)state)->GetType() ==  ChQvState::buildInstance)
	{	
		ChQvBuildState *bldState = (ChQvBuildState*)state;
		if(!m_pRenderData) m_pRenderData = new ChQvRenderBaseData(this);
		ChQvRenderBaseData *pRenderData =  (ChQvRenderBaseData *)m_pRenderData;
		ChQvSpotLightInstance *pInstance = new ChQvSpotLightInstance;
		pInstance->Attach(this, bldState);
	}	
	else if( ((ChQvState*)state)->GetType() ==  ChQvState::draw)
	{
		#if defined(CH_USE_3DR)
		G3dHandle_t hGC = ((ChQvState*)state)->GetView()->GetGC();
	  
		if(wLightNum < G3D_MAX_LIGHTS)
		{
			Float_t		dimmer = 	int(on.value) ? 1. : 0.;
			float fIntensity = intensity.value;
			fIntensity = min(fIntensity, 1.);
			fIntensity = max(fIntensity, 0.);
			ColorF_t	diffuse;	Qv2Native(color, diffuse);
			ColorF_t	specular;	Qv2Native(color,specular) ;
			ColorF_t	ambient = {0.,0.,0.};
			// Transform light from model (vrml) to world coords for 3dr
			PointF_t	locV;		Qv2Native(location,locV);
			PointFW_t	loc;		
			GxTransformF_t mat;
			G3dSetActiveStack(hGC, G3DT_MODEL);
			G3dGetTransform(hGC,  mat);
			G3dTransformPointF( &locV, &loc, mat );
			loc.w = 1.;				 // noninfinite light
			
			PointF_t	dir;		Qv2Native(direction,dir);
			PointFW_t	tmp;		
			G3dTransformPointF( &dir, &tmp, mat );
			CopyPoint(tmp, dir);

			Float_t		expon	=	Float_t(dropOffRate.value);
			Float_t		spotAngle	=	Float_t(cutOffAngle.value);
		
			specular.r *= fIntensity;
			specular.g *= fIntensity;
			specular.b *= fIntensity;

			diffuse.r *= fIntensity;
			diffuse.g *= fIntensity;
			diffuse.b *= fIntensity;

			G3dSetLight( hGC,  wLightNum, G3DL_DIMMER,    	(Float_t *)&dimmer     );			
			G3dSetLight( hGC,  wLightNum, G3DL_AMBIENT, 	(Float_t *)&ambient  );			
			G3dSetLight( hGC,  wLightNum, G3DL_DIFFUSE,  	(Float_t *)&diffuse   );			
			G3dSetLight( hGC,  wLightNum, G3DL_SPECULAR, 	(Float_t *)&specular  );			
			G3dSetLight( hGC,  wLightNum, G3DL_SPOT_EXP,     	(Float_t *)&expon      );			
			G3dSetLight( hGC,  wLightNum, G3DL_SPOT_ANGLE,  (Float_t *)&spotAngle     );
 
			G3dSetLight( hGC,  wLightNum, G3DL_DIRECTION,  (Float_t *)&dir  );			
			G3dSetLight( hGC,  wLightNum, G3DL_LOCATION,  (Float_t *)&loc  );
			//G3dSetLight( hGC,  wLightNum, G3DL_ATTENA,  (Float_t *)&atten  );
			//G3dSetLight( hGC,  wLightNum, G3DL_ATTENB,  (Float_t *)&atten  );
			//G3dSetLight( hGC,  wLightNum, G3DL_ATTENC,  (Float_t *)&atten  );
		}
		#endif
	}
	else if( ((ChQvState*)state)->GetType() ==  ChQvState::command)
	{
		if(!((ChQvState*)state)->GetCmd().CompareNoCase("light"))	 // hard coded yucko!!
		{
			if(((ChQvState*)state)->GetIData() == wLightNum-1)		 // oughta use keys
			{
				intensity.value = ((ChQvState*)state)->GetFData();
				intensity.value = max(intensity.value, 0.);
				intensity.value = min(intensity.value, 1.);
			}
		}
	}			
	else if( ((ChQvState*)state)->GetType() ==  ChQvState::findGlobals)
	{
		ChQvGlobalSearchState *srchState = (ChQvGlobalSearchState*)state; 

		if( on.value > 0.) srchState->SetLightOn( );

⌨️ 快捷键说明

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