📄 ch3dtrvs.cpp
字号:
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 + -