21 VSFileSystem::vs_fscanf( fp,
"%d %f\n<%f %f %f>", &width, &tmass, &this->Scales.i, &this->Scales.j, &this->Scales.k );
24 if (Scales.i && Scales.j && Scales.k) {
25 this->Scales.i *= Scales.i;
26 this->Scales.j *= Scales.j;
27 this->Scales.k *= Scales.k;
29 numcontterr = width*width;
30 data =
new Terrain*[numcontterr];
32 std::string *filenames =
new std::string[numcontterr];
34 for (i = 0; i < numcontterr; i++) {
41 for (
int k = 0;
k < 512;
k++) {
45 vector< mesh_polygon >polies;
47 sscanf( tmp+i+1,
"%f,%f", &sizeX, &sizeZ );
59 for (i = 0; i < width; i++)
60 for (
int j = 0;
j < width;
j++) {
68 if (md[i*width+
j].mesh == NULL)
69 data[i*width+
j] =
new Terrain( filenames[i*width+
j].c_str(), this->Scales, tmass, 0, up );
71 location =
new QVector[numcontterr];
72 dirty =
new bool[numcontterr];
78 for (i = 0; i < numcontterr; i++)
80 if ( sizeX != data[i]->getSizeX() || sizeZ != data[i]->getSizeZ() )
82 "Warning: Sizes of terrain do not match...expect gaps in continuous terrain\n" );
85 for (i = 0; i < width; i++)
86 for (
int j = 0;
j < width;
j++) {
87 int nj =
j-1 < 0 ? width-1 :
j-1;
88 int ni = i-1 < 0 ? width-1 : i-1;
89 if (data[
j+width*i] && data[(
j+1)%width+width*i] && data[
j+width*( (i+1)%width )] && data[nj+width*i]
90 && data[
j+width*ni]) {
92 data[
j+width*( (i+1)%width )],
97 location[
j+width*i].Set( 0+sizeX*
j, 0, 0-sizeZ*i );
114 for (
int i = 0;
i < numcontterr;
i++) {
133 for (
int i = 0;
i < numcontterr;
i++) {
143 bool datacol =
false;
144 for (
int i = 0;
i < numcontterr;
i++) {
157 ShipPos.i /= Scales.i;
158 ShipPos.j /= Scales.j;
159 ShipPos.k /= Scales.k;
160 for (
int i = 0;
i < numcontterr;
i++) {
161 QVector tmploc = ShipPos-location[
i]+
QVector( (data[
i])->getminX()+.5*(data[i])->getSizeX(), 0,
162 (data[i])->getminZ()+.5*(data[i])->getSizeZ() );
163 if ( data[i]->
GetGroundPos( tmploc, norm, ident, sizeX*width, sizeZ*width ) ) {
164 tmploc += location[i]-
QVector( (data[i])->getminX()+.5*(data[i])->getSizeX(), 0,
165 (data[i])->getminZ()+.5*(data[i])->getSizeZ() );
167 tmploc.i *= Scales.i;
168 tmploc.j *= Scales.j;
169 tmploc.k *= Scales.k;
174 ShipPos.i *= Scales.i;
175 ShipPos.j *= Scales.j;
176 ShipPos.k *= Scales.k;
181 for (
int i = 0;
i < numcontterr;
i++)
182 if ( data[
i]->
GetGroundPos( ShipPos, norm, sizeX*width, sizeZ*width ) )
188 for (
int i = 0;
i < numcontterr;
i++)
194 for (
int i = 0;
i < numcontterr;
i++)
200 for (
int i = 0;
i < numcontterr;
i++)
206 for (
int i = 0;
i < numcontterr;
i++)
213 for (
int i = 0;
i < numcontterr;
i++) {
216 }
else if (md[i].mesh) {
218 md[i].mesh->Position() );
229 CopyMatrix( this->transformation, transformation );
231 for (
int i = 0;
i < numcontterr;
i++)
235 bool ContinuousTerrain::checkInvScale(
double &pos,
double campos,
float size )
239 float tmp = pos-campos;
240 while ( fabs( tmp-size ) < fabs( tmp ) ) {
244 while ( fabs( tmp+size ) < fabs( tmp ) ) {
259 for (
int i = 0;
i < numcontterr;
i++) {
261 (data[
i] ? (data[
i])->getminX() : md[i].mesh->corner_min().i)+.5
267 *( data[i] ? (data[i])->getSizeZ() : (md[i].mesh->corner_max().i-md[i].
mesh->
corner_min(
273 data[i]->Collide( un, transform );
275 bool autocol =
false;
277 if (diff.j < 0) autocol =
true;
278 diff.i = fmod( (
double) diff.i, (
double) sizeX*width );
280 diff.i += sizeX*width;
281 diff.k = fmod( (
double) diff.k, (
double) sizeZ*width );
283 diff.k += sizeZ*width;
300 Vector smallNormal, bigNormal;
304 smallNormal =
Vector( 0, -1, 0 );
305 bigNormal =
Vector( 0, 1, 0 );
308 if (md[i].collider) {
317 smallpos.Set( (mycollide[0].
a1.x+mycollide[0].
b1.
x+mycollide[0].
c1.
x)/3,
318 (mycollide[0].
a1.
y+mycollide[0].
b1.
y+mycollide[0].
c1.
y)/3,
319 (mycollide[0].
a1.
z+mycollide[0].
b1.
z+mycollide[0].
c1.
z)/3 );
321 bigpos.Set( (mycollide[0].a2.x+mycollide[0].
b2.
x+mycollide[0].
c2.
x)/3,
322 (mycollide[0].
a2.
y+mycollide[0].
b2.
y+mycollide[0].
c2.
y)/3,
323 (mycollide[0].
a2.
z+mycollide[0].
b2.
z+mycollide[0].
c2.
z)/3 );
326 sn.
Cross( mycollide[0].b1-mycollide[0].
a1, mycollide[0].c1-mycollide[0].a1 );
327 bn.
Cross( mycollide[0].b2-mycollide[0].a2, mycollide[0].c2-mycollide[0].a2 );
330 smallNormal.Set( sn.
x, sn.
y, sn.
z );
331 bigNormal.Set( bn.
x, bn.
y, bn.
z );
341 static float mass = 1000;
355 dirty[i] |= checkInvScale( location[i].i, campos.i, sizeX );
356 dirty[i] |= checkInvScale( location[i].
k, campos.k, sizeZ );
359 (data[i] ? (data[i])->getminX() : md[i].mesh->corner_min().i)+.5
364 *( data[i] ? (data[i])->getSizeZ() : (md[i].mesh->corner_max().i-md[i].
mesh->
corner_min().i) ) ) ) ) );
372 for (
int i = 0;
i < numcontterr;
i++)
378 md[i].
mat = transform;