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