Files
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

266 lines
4.8 KiB
C++

#include<stdafx.h>
#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;i<Z-1;i++)
{
for(j=0;j<X-1;j++)
{
field[i*X+j] = ptr[i*(X-1)+j];
}
field[i*X+j] = ptr[i*(X-1)+j-1];
}
for(j=0;j<X-1;j++)
{
field[i*X+j] = ptr[(i-1)*(X-1)+j];
}
field[i*X+j] = ptr[(i-1)*(X-1)+j-1];
image.UnLock();
Blur2D();
/*
Image diffImg;
diffImg.CreateBlank(X, Z);
diffImg.CreateDifferentialMap(field.GetData(), X);
diffImg.SaveTiff("test1.tif");
*/
}
void TCTHeightField::Clone(TCTHeightField &hf)
{
X = hf.X;
Z = hf.Z;
field.SetLength(X*Z);
dX = hf.dX;
dY = hf.dY;
dZ = hf.dZ;
SetOffset(hf.GetOffset());
//state0=hf.state0;
//state1=hf.state1;
field = hf.field;
nrOfIZs = hf.nrOfIZs;
if(Attached)
{
BuildModel();
}//end of Attached
}
void TCTHeightField::Attach(ElementRenderer::ListElement *parent,int index)
{
//state0=s0;
//state1=s1;
if(terrainGroup)
{
Unregister_Object(terrainGroup);
delete terrainGroup;
terrainGroup=0;
}
#ifdef _DEBUG
#undef new
#endif
terrainGroup = new GroupElement();
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
Register_Object(terrainGroup);
parent->AttachIndexedChild(index, terrainGroup);
BuildModel();
Attached=1;
}
void TCTHeightField::BuildModel()
{
// terrainGroup->DetachChildren();
ChainIteratorOf<Element*> *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<ElementRenderer::Element *> *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;j<Shape->GetNum();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;i<end;i++)
{
curelt = Cast_Pointer(ElementRenderer::ListElement*, group)->GetIndexedElement(i);
if(curelt->IsDerivedFrom(ElementRenderer::ShapeElement::DefaultData) )
{
MidLevelRenderer::MLRShape *Shape = Cast_Object(ElementRenderer::ShapeElement *,curelt)->GetMLRShape();
for(j=0;j<Shape->GetNum();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;i<terrain.GetLength();i++)
{
Check_Object(terrain[i]);
for(j=0;j<terrain[i]->GetNum();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();
}
}