#include #include"TCTHeightField.h" #include "MLRHeightField.hpp" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif TCTHeightField::TCTHeightField() : MLRHeightField() { Attached = FALSE; } void TCTHeightField::Create(Image &image) { X = image.GetWidth()+1; Z = image.GetHeight()+1; ASSERT(image.GetBpp()==8); field.SetLength(X*Z); unsigned char *ptr; ptr=(unsigned char *)image.Lock(); int i, j; for(i=0;iAttachIndexedChild(index, terrainGroup); BuildModel(); Attached=1; } void TCTHeightField::BuildModel() { // terrainGroup->DetachChildren(); ChainIteratorOf *children = terrainGroup->MakeIterator(); Element *child; while ((child = children->ReadAndNext()) != NULL) { terrainGroup->DetachChild(child); Unregister_Object(child); delete child; } MakeTerrainFromField(); } void SetStateForElement( ElementRenderer::Element *group, MidLevelRenderer::MLRState &state, int sn ) { Check_Object(group); if(group->IsDerivedFrom(ElementRenderer::GroupElement::DefaultData)) { Stuff::ChainIteratorOf *children; ElementRenderer::Element *curelt; children = Cast_Pointer(ElementRenderer::GroupElement*, group)->MakeIterator(); int j; while ((curelt = children->ReadAndNext()) != NULL) { if(curelt->IsDerivedFrom(ElementRenderer::ShapeElement::DefaultData) ) { MidLevelRenderer::MLRShape *Shape = Cast_Object(ElementRenderer::ShapeElement *,curelt)->GetMLRShape(); for(j=0;jGetNum();j++) { Check_Object(Shape->Find(j)); Shape->Find(j)->SetReferenceState(state, sn); } } else { SetStateForElement( curelt, state, sn ); } } } else if(group->IsDerivedFrom(ElementRenderer::ListElement::DefaultData)) { ElementRenderer::Element *curelt; int i, j, end = Cast_Pointer(ElementRenderer::ListElement*, group)->GetActiveCount(); for(i=0;iGetIndexedElement(i); if(curelt->IsDerivedFrom(ElementRenderer::ShapeElement::DefaultData) ) { MidLevelRenderer::MLRShape *Shape = Cast_Object(ElementRenderer::ShapeElement *,curelt)->GetMLRShape(); for(j=0;jGetNum();j++) { Check_Object(Shape->Find(j)); Shape->Find(j)->SetReferenceState(state, sn); } } else { SetStateForElement( curelt, state, sn ); } } } } void TCTHeightField::SetState(MidLevelRenderer::MLRState &state, int sn) { if(!Attached) return; if(sn==0) state0=state; else state1=state; int i, j; for(i=0;iGetNum();j++) { Check_Object(terrain[i]->Find(j)); terrain[i]->Find(j)->SetReferenceState(state, sn); } } if(simpleTerrainGroup!=NULL) { SetStateForElement(simpleTerrainGroup, state, sn); } } TCTHeightField::~TCTHeightField() { //if(Attached) terrainGroup->DetachChildren(); } void TCTHeightField::SetScale(Stuff::Scalar xs, Stuff::Scalar ys, Stuff::Scalar zs) { dX=xs; dY=ys; dZ=zs; if(Attached) { BuildModel(); }//end of Attached } void TCTHeightField::SetSize(Scalar xs,Scalar zs) { X=(int)xs; Z=(int)zs; if(Attached) { BuildModel(); } } void TCTHeightField::SetPara(ExportInfo &einf) { double x, y, z, off; einf.GetScale_Offset(&x, &y, &z, &off); dX = (float)x; dY = (float)y; dZ = (float)z; SetOffset((float)off); if(Attached) { BuildModel(); } }