Am Montag, 21. Mai 2007 schrieb The Watermelon:
> On 5/21/07, Dennis Schridde <[EMAIL PROTECTED]> wrote:
> > r1316
> > Resolved conflicts.
> > vertexPos and position seems to be mixed up sometimes... (Eg. both .sx
> > and .x
> > are turned into vertexPos.x)
>
> Fixed in piefloat5_3,some of the sx to vertexPos.x are intended,because
> PIEVERTEX's sx,sy,yz are the equivalent of SV_MESH's x,y,z...the namings
> were very confusing,so I decided to add a struct name to them,so you can
> figure out which 3 are the ones needed to be passed to renderer/copied to
> PIEVERTEX struct.
>
> This one should be 'bug-free'(hopefully)...
Copy of that patch. (Diff against my patch is smaller.)
Index: src/structure.c
===================================================================
--- src/structure.c	(revision 1313)
+++ src/structure.c	(working copy)
@@ -3956,7 +3956,8 @@
 {
 	UDWORD			widthScatter,breadthScatter;
 	UDWORD			percentDamage, emissionInterval, iPointsToAdd, iPointsRequired;
-	Vector3i dv;
+	Vector3i			dv;
+	Vector3i		tmpVector3i;
 
 	ASSERT( psBuilding != NULL,
 		"structureUpdate: Invalid Structure pointer" );
@@ -4078,7 +4079,8 @@
 				UDWORD	pointIndex;
 
 				pointIndex = rand()%(psBuilding->sDisplay.imd->npoints-1);
-				point = &(psBuilding->sDisplay.imd->points[pointIndex]);
+				tmpVector3i = Vector3fToVector3i(psBuilding->sDisplay.imd->points[pointIndex]);
+				point = &tmpVector3i;
 				position.x = psBuilding->x + point->x;
 				realY = MAKEINT((structHeightScale(psBuilding) * point->y));
 				position.y = psBuilding->z + realY;
Index: src/display3d.c
===================================================================
--- src/display3d.c	(revision 1316)
+++ src/display3d.c	(working copy)
@@ -256,7 +256,7 @@
 //UDWORD	averageHeight;
 
 /* temporary buffer used for flattening IMDs */
-static Vector3i	alteredPoints[iV_IMD_MAX_POINTS];
+static Vector3f	alteredPoints[iV_IMD_MAX_POINTS];
 
 //number of tiles visible
 UDWORD	visibleXTiles;
@@ -733,10 +733,10 @@
 				else if(playerZTile+i > (SDWORD)(mapHeight-1) )
 					edgeY = mapHeight-1;
 
-				tileScreenInfo[i][j].x = world_coord(j-terrainMidX);
-				tileScreenInfo[i][j].y = 0;//map_TileHeight(edgeX,edgeY);
-				tileScreenInfo[i][j].z = world_coord(terrainMidY-i);
-				tileScreenInfo[i][j].sz = pie_RotateProject((Vector3i*)&tileScreenInfo[i][j].x, (Vector2i*)&tileScreenInfo[i][j].sx);
+				tileScreenInfo[i][j].vertexPos.x = world_coord(j - terrainMidX);
+				tileScreenInfo[i][j].vertexPos.y = 0;
+				tileScreenInfo[i][j].vertexPos.z = world_coord(terrainMidY - i);
+				tileScreenInfo[i][j].position.z = pie_RotateProject((Vector3i*)&tileScreenInfo[i][j].vertexPos, (Vector2i*)&tileScreenInfo[i][j].position);
 
 				if (pie_GetFogEnabled())
 				{
@@ -745,7 +745,7 @@
 				}
 				else
 				{
-					tileScreenInfo[i][j].light.argb = lightDoFogAndIllumination( mapTile(edgeX, edgeY)->illumination, rx - tileScreenInfo[i][j].x, rz - world_coord(i - terrainMidY), &specular );
+					tileScreenInfo[i][j].light.argb = lightDoFogAndIllumination( mapTile(edgeX, edgeY)->illumination, rx - tileScreenInfo[i][j].vertexPos.x, rz - world_coord(i - terrainMidY), &specular );
 				}
 
 				if( playerXTile+j < -1 ||
@@ -766,14 +766,14 @@
 
 				psTile = mapTile(playerXTile+j, playerZTile+i);
 				/* Get a pointer to the tile at this location */
-				tileScreenInfo[i][j].x = world_coord(j-terrainMidX);
+				tileScreenInfo[i][j].vertexPos.x = world_coord(j - terrainMidX);
 
 				if (TERRAIN_TYPE(psTile) == TER_WATER)
 				{
 					tileScreenInfo[i][j].bWater = TRUE;
 				}
-				tileScreenInfo[i][j].y = map_TileHeight(playerXTile+j, playerZTile+i);
-				tileScreenInfo[i][j].z = world_coord(terrainMidY-i);
+				tileScreenInfo[i][j].vertexPos.y = map_TileHeight(playerXTile+j, playerZTile+i);
+				tileScreenInfo[i][j].vertexPos.z = world_coord(terrainMidY - i);
 
 				/* Is it in the centre and therefore worth averaging height over? */
 				if ( i > MIN_TILE_Y &&
@@ -781,7 +781,7 @@
 					 j > MIN_TILE_X &&
 					 j < MAX_TILE_X )
 				{
-					averageCentreTerrainHeight += tileScreenInfo[i][j].y;
+					averageCentreTerrainHeight += tileScreenInfo[i][j].vertexPos.y;
 					numTilesAveraged++;
 				}
 				realX = playerXTile+j;
@@ -827,38 +827,36 @@
 					PushedDown = TRUE;
 					shiftVal = WATER_DEPTH + environGetData(playerXTile+j, playerZTile+i) * 1.5f;
 					altVal = 0;//environGetValue(playerXTile+j,playerZTile+i);
-					tileScreenInfo[i][j].y -= shiftVal + altVal;
+					tileScreenInfo[i][j].vertexPos.y -= shiftVal + altVal;
 					// And darken it.
 					TileIllum = (UBYTE)(TileIllum * 0.75f);
 				}
 
-				tileScreenInfo[i][j].sz = pie_RotateProject((Vector3i*)&tileScreenInfo[i][j], (Vector2i*)&tileScreenInfo[i][j].sx);
-
-				tileScreenInfo[i][j].light.argb = lightDoFogAndIllumination(TileIllum, rx - tileScreenInfo[i][j].x, rz - world_coord(i-terrainMidY), &specular);
-
+				tileScreenInfo[i][j].position.z = pie_RotateProject((Vector3i*)&tileScreenInfo[i][j].vertexPos, (Vector2i*)&tileScreenInfo[i][j].position);
+				tileScreenInfo[i][j].light.argb = lightDoFogAndIllumination(TileIllum, rx - tileScreenInfo[i][j].vertexPos.x, rz - world_coord(i - terrainMidY), &specular);
 				tileScreenInfo[i][j].specular.argb = specular;
 
 				// If it's any water tile..
 				if(IsWaterTile) {
 					// If it's the main water tile then bring it back up because it was pushed down for the river bed calc.
-					tmp_y = tileScreenInfo[i][j].y;
+					tmp_y = tileScreenInfo[i][j].vertexPos.y;
 					if (PushedDown) { //TextNum == WaterTileID) {
-						tileScreenInfo[i][j].y += (shiftVal + 2*altVal);
+						tileScreenInfo[i][j].vertexPos.y += shiftVal + 2*altVal;
 					}
 
 					// Transform it into the wx,wy mesh members.
-					tileScreenInfo[i][j].wz = pie_RotateProject((Vector3i*)&tileScreenInfo[i][j], (Vector2i*)&tileScreenInfo[i][j].wx);
+					tileScreenInfo[i][j].waterPos.z = pie_RotateProject((Vector3i*)&tileScreenInfo[i][j].vertexPos, (Vector2i*)&tileScreenInfo[i][j].waterPos);
 					tileScreenInfo[i][j].wlight.argb = lightDoFogAndIllumination(
-						TileIllum, rx - tileScreenInfo[i][j].x, rz - world_coord(i-terrainMidY), &specular);
-					tileScreenInfo[i][j].water_height = tileScreenInfo[i][j].y;
-					tileScreenInfo[i][j].y = tmp_y;
+						TileIllum, rx - tileScreenInfo[i][j].vertexPos.x, rz - world_coord(i - terrainMidY), &specular);
+					tileScreenInfo[i][j].water_height = tileScreenInfo[i][j].vertexPos.y;
+					tileScreenInfo[i][j].vertexPos.y = tmp_y;
 				} else {
 					// If it was'nt a water tile then need to ensure wx,wy are valid because
 					// a water tile might be sharing verticies with it.
-					tileScreenInfo[i][j].wx = tileScreenInfo[i][j].sx;
-					tileScreenInfo[i][j].wy = tileScreenInfo[i][j].sy;
-					tileScreenInfo[i][j].wz = tileScreenInfo[i][j].sz;
-					tileScreenInfo[i][j].water_height = tileScreenInfo[i][j].y;
+					tileScreenInfo[i][j].waterPos.x = tileScreenInfo[i][j].position.x;
+					tileScreenInfo[i][j].waterPos.y = tileScreenInfo[i][j].position.y;
+					tileScreenInfo[i][j].waterPos.z = tileScreenInfo[i][j].position.z;
+					tileScreenInfo[i][j].water_height = tileScreenInfo[i][j].vertexPos.y;
 				}
 			}
 		}
@@ -899,9 +897,9 @@
 				tileIJ[i][j].i = i;
 				tileIJ[i][j].j = j;
 				//get distance of furthest corner
-				zMax = MAX(tileScreenInfo[i][j].sz, tileScreenInfo[i+1][j].sz);
-				zMax = MAX(zMax, tileScreenInfo[i+1][j+1].sz);
-				zMax = MAX(zMax, tileScreenInfo[i][j+1].sz);
+				zMax = MAX(tileScreenInfo[i][j].position.z, tileScreenInfo[i+1][j].position.z);
+				zMax = MAX(zMax, tileScreenInfo[i+1][j+1].position.z);
+				zMax = MAX(zMax, tileScreenInfo[i][j+1].position.z);
 				tileIJ[i][j].depth = zMax;
 				if( (UDWORD)i > mapHeight || (UDWORD)j > mapWidth )
 				{
@@ -1725,7 +1723,7 @@
 	SDWORD		rotation;
 	UDWORD		brightness, specular;
 	Vector3i dv;
-	Vector3i *vecTemp;
+	Vector3f *vecTemp;
 	BOOL		bForceDraw = ( !getRevealStatus() && psFeature->psStats->visibleAtStart);
 	int shadowFlags = 0;
 
@@ -1961,7 +1959,7 @@
 	Vector3i dv;
 	SDWORD			i;
 	iIMDShape *lImd = NULL, *imd = NULL;
-	Vector3i *temp = NULL;
+	Vector3f		*temp = NULL;
 	BOOL			bHitByElectronic = FALSE;
 	iIMDShape		*pRepImd;
 	REPAIR_FACILITY		*psRepairFac = NULL;
@@ -2026,7 +2024,7 @@
 				SDWORD strHeight;
 
 				// Get a copy of the points
-				memcpy( alteredPoints, imd->points, imd->npoints * sizeof(Vector3i) );
+				memcpy( alteredPoints, imd->points, imd->npoints * sizeof(Vector3f) );
 
 				// Get the height of the centre point for reference
 				strHeight = psStructure->z;//map_Height(structX,structY) + 64;
@@ -2466,7 +2464,7 @@
 {
 	Vector3i dv;
 	SDWORD			x, y, r;
-	Vector3i *temp = NULL;
+	Vector3f		*temp = NULL;
 //	SDWORD			centreX, centreZ;
 	SDWORD			buildingBrightness, specular;
 	//store the frame number for when deciding what has been clicked on
@@ -2536,7 +2534,7 @@
 	SDWORD			rotation;
 	Vector3i			dv;
 	UDWORD			i;
-	Vector3i			*temp;
+	Vector3f		*temp;
 	UDWORD			buildingBrightness, specular;
 	// HACK to be able to use static shadows for walls
 	// We just store a separate IMD for each direction
@@ -2699,8 +2697,8 @@
 /* renderShadow: draws shadow under droid */
 void renderShadow( DROID *psDroid, iIMDShape *psShadowIMD )
 {
-	Vector3i			dv;
-	Vector3i			*pVecTemp;
+	Vector3i		dv;
+	Vector3f		*pVecTemp;
 	SDWORD			shadowScale;
 	UDWORD brightness, specular;
 //	SDWORD centreX, centreZ;
@@ -4028,20 +4026,20 @@
 		{
 			bWaterTile = tileScreenInfo[i][j].bWater;
 
-			tileZ = (bWaterTile ? tileScreenInfo[i][j].wz : tileScreenInfo[i][j].sz);
+			tileZ = (bWaterTile ? tileScreenInfo[i][j].waterPos.z : tileScreenInfo[i][j].position.z);
 			if(tileZ<=nearestZ)
 			{
-				quad.coords[0].x = (bWaterTile ? tileScreenInfo[i][j].wx : tileScreenInfo[i][j].sx);
-				quad.coords[0].y = (bWaterTile ? tileScreenInfo[i][j].wy : tileScreenInfo[i][j].sy);
+				quad.coords[0].x = (bWaterTile ? tileScreenInfo[i][j].waterPos.x : tileScreenInfo[i][j].position.x);
+				quad.coords[0].y = (bWaterTile ? tileScreenInfo[i][j].waterPos.y : tileScreenInfo[i][j].position.y);
 
-				quad.coords[1].x = (bWaterTile ? tileScreenInfo[i][j+1].wx : tileScreenInfo[i][j+1].sx);
-				quad.coords[1].y = (bWaterTile ? tileScreenInfo[i][j+1].wy : tileScreenInfo[i][j+1].sy);
+				quad.coords[1].x = (bWaterTile ? tileScreenInfo[i][j+1].waterPos.x : tileScreenInfo[i][j+1].position.x);
+				quad.coords[1].y = (bWaterTile ? tileScreenInfo[i][j+1].waterPos.y : tileScreenInfo[i][j+1].position.y);
 
-				quad.coords[2].x = (bWaterTile ? tileScreenInfo[i+1][j+1].wx : tileScreenInfo[i+1][j+1].sx);
-				quad.coords[2].y = (bWaterTile ? tileScreenInfo[i+1][j+1].wy :tileScreenInfo[i+1][j+1].sy);
+				quad.coords[2].x = (bWaterTile ? tileScreenInfo[i+1][j+1].waterPos.x : tileScreenInfo[i+1][j+1].position.x);
+				quad.coords[2].y = (bWaterTile ? tileScreenInfo[i+1][j+1].waterPos.y :tileScreenInfo[i+1][j+1].position.y);
 
-				quad.coords[3].x = (bWaterTile ? tileScreenInfo[i+1][j].wx: tileScreenInfo[i+1][j].sx);
-				quad.coords[3].y = (bWaterTile ? tileScreenInfo[i+1][j].wy: tileScreenInfo[i+1][j].sy);
+				quad.coords[3].x = (bWaterTile ? tileScreenInfo[i+1][j].waterPos.x: tileScreenInfo[i+1][j].position.x);
+				quad.coords[3].y = (bWaterTile ? tileScreenInfo[i+1][j].waterPos.y: tileScreenInfo[i+1][j].position.y);
 
 				/* We've got a match for our mouse coords */
 				if(inQuad(&pt,&quad))
@@ -4146,7 +4144,7 @@
 		"flattenImd: too many points in the PIE to flatten it" );
 
 	/* Get a copy of the points */
-	memcpy(alteredPoints,imd->points,imd->npoints*sizeof(Vector3i));
+	memcpy(alteredPoints, imd->points, imd->npoints * sizeof(Vector3f));
 
 	/* Get the height of the centre point for reference */
 	centreHeight = map_Height(structX,structY);
@@ -4372,41 +4370,61 @@
 	/* Check for rotations and flips - this sets up the coordinates for texturing */
 	flipsAndRots(tileNumber & ~TILE_NUMMASK);
 
-	tileScreenInfo[i+0][j+0].tu = (UWORD)(psP1->x + offset.x);
-	tileScreenInfo[i+0][j+0].tv = (UWORD)(psP1->y + offset.y);
+	tileScreenInfo[i+0][j+0].tu = (float)(psP1->x + offset.x);
+	tileScreenInfo[i+0][j+0].tv = (float)(psP1->y + offset.y);
 
-	tileScreenInfo[i+0][j+1].tu = (UWORD)(psP2->x + offset.x);
-	tileScreenInfo[i+0][j+1].tv = (UWORD)(psP2->y + offset.y);
+	tileScreenInfo[i+0][j+1].tu = (float)(psP2->x + offset.x);
+	tileScreenInfo[i+0][j+1].tv = (float)(psP2->y + offset.y);
 
-	tileScreenInfo[i+1][j+1].tu = (UWORD)(psP3->x + offset.x);
-	tileScreenInfo[i+1][j+1].tv = (UWORD)(psP3->y + offset.y);
+	tileScreenInfo[i+1][j+1].tu = (float)(psP3->x + offset.x);
+	tileScreenInfo[i+1][j+1].tv = (float)(psP3->y + offset.y);
 
-	tileScreenInfo[i+1][j+0].tu = (UWORD)(psP4->x + offset.x);
-	tileScreenInfo[i+1][j+0].tv = (UWORD)(psP4->y + offset.y);
+	tileScreenInfo[i+1][j+0].tu = (float)(psP4->x + offset.x);
+	tileScreenInfo[i+1][j+0].tv = (float)(psP4->y + offset.y);
 
 	/* The first triangle */
-	memcpy(&vertices[0], &tileScreenInfo[i+0][j+0], sizeof(PIEVERTEX));
-	memcpy(&vertices[1], &tileScreenInfo[i+0][j+1], sizeof(PIEVERTEX));
+	vertices[0].vertexPos = Vector3iToVector3f(tileScreenInfo[i+0][j+0].vertexPos);
+	vertices[0].u = tileScreenInfo[i+0][j+0].tu;
+	vertices[0].v = tileScreenInfo[i+0][j+0].tv;
+	vertices[0].light = tileScreenInfo[i+0][j+0].light;
+	vertices[0].specular = tileScreenInfo[i+0][j+0].specular;
+
+	vertices[1].vertexPos = Vector3iToVector3f(tileScreenInfo[i+0][j+1].vertexPos);
+	vertices[1].u = tileScreenInfo[i+0][j+1].tu;
+	vertices[1].v = tileScreenInfo[i+0][j+1].tv;
+	vertices[1].light = tileScreenInfo[i+0][j+1].light;
+	vertices[1].specular = tileScreenInfo[i+0][j+1].specular;
+
 	if (onWaterEdge)
 	{
-		vertices[0].sy = tileScreenInfo[i+0][j+0].water_height;
-		vertices[1].sy = tileScreenInfo[i+0][j+1].water_height;
+		vertices[0].vertexPos.y = tileScreenInfo[i+0][j+0].water_height;
+		vertices[1].vertexPos.y = tileScreenInfo[i+0][j+1].water_height;
 	}
 
 	if (TRI_FLIPPED(psTile))
 	{
-		memcpy(&vertices[2], &tileScreenInfo[i+1][j+0], sizeof(PIEVERTEX));
+		vertices[2].vertexPos = Vector3iToVector3f(tileScreenInfo[i+1][j+0].vertexPos);
+		vertices[2].u = tileScreenInfo[i+1][j+0].tu;
+		vertices[2].v = tileScreenInfo[i+1][j+0].tv;
+		vertices[2].light = tileScreenInfo[i+1][j+0].light;
+		vertices[2].specular = tileScreenInfo[i+1][j+0].specular;
+
 		if (onWaterEdge)
 		{
-			vertices[2].sy = tileScreenInfo[i+1][j+0].water_height;
+			vertices[2].vertexPos.y = tileScreenInfo[i+1][j+0].water_height;
 		}
 	}
 	else
 	{
-		memcpy(&vertices[2], &tileScreenInfo[i+1][j+1], sizeof(PIEVERTEX));
+		vertices[2].vertexPos = Vector3iToVector3f(tileScreenInfo[i+1][j+1].vertexPos);
+		vertices[2].u = tileScreenInfo[i+1][j+1].tu;
+		vertices[2].v = tileScreenInfo[i+1][j+1].tv;
+		vertices[2].light = tileScreenInfo[i+1][j+1].light;
+		vertices[2].specular = tileScreenInfo[i+1][j+1].specular;
+
 		if (onWaterEdge)
 		{
-			vertices[2].sy = tileScreenInfo[i+1][j+1].water_height;
+			vertices[2].vertexPos.y = tileScreenInfo[i+1][j+1].water_height;
 		}
 	}
 
@@ -4417,27 +4435,47 @@
 	/* The second triangle */
 	if (TRI_FLIPPED(psTile))
 	{
-		memcpy(&vertices[0], &tileScreenInfo[i+0][j+1], sizeof(PIEVERTEX));
+		vertices[0].vertexPos = Vector3iToVector3f(tileScreenInfo[i+0][j+1].vertexPos);
+		vertices[0].u = tileScreenInfo[i+0][j+1].tu;
+		vertices[0].v = tileScreenInfo[i+0][j+1].tv;
+		vertices[0].light = tileScreenInfo[i+0][j+1].light;
+		vertices[0].specular = tileScreenInfo[i+0][j+1].specular;
+
 		if (onWaterEdge)
 		{
-			vertices[0].sy = tileScreenInfo[i+0][j+1].water_height;
+			vertices[0].vertexPos.y = tileScreenInfo[i+0][j+1].water_height;
 		}
 	}
 	else
 	{
-		memcpy(&vertices[0], &tileScreenInfo[i+0][j+0], sizeof(PIEVERTEX));
+		vertices[0].vertexPos = Vector3iToVector3f(tileScreenInfo[i+0][j+0].vertexPos);
+		vertices[0].u = tileScreenInfo[i+0][j+0].tu;
+		vertices[0].v = tileScreenInfo[i+0][j+0].tv;
+		vertices[0].light = tileScreenInfo[i+0][j+0].light;
+		vertices[0].specular = tileScreenInfo[i+0][j+0].specular;
+
 		if (onWaterEdge)
 		{
-			vertices[0].sy = tileScreenInfo[i+0][j+0].water_height;
+			vertices[0].vertexPos.y = tileScreenInfo[i+0][j+0].water_height;
 		}
 	}
 
-	memcpy(&vertices[1], &tileScreenInfo[i+1][j+1], sizeof(PIEVERTEX));
-	memcpy(&vertices[2], &tileScreenInfo[i+1][j+0], sizeof(PIEVERTEX));
+	vertices[1].vertexPos = Vector3iToVector3f(tileScreenInfo[i+1][j+1].vertexPos);
+	vertices[1].u = tileScreenInfo[i+1][j+1].tu;
+	vertices[1].v = tileScreenInfo[i+1][j+1].tv;
+	vertices[1].light = tileScreenInfo[i+1][j+1].light;
+	vertices[1].specular = tileScreenInfo[i+1][j+1].specular;
+
+	vertices[2].vertexPos = Vector3iToVector3f(tileScreenInfo[i+1][j+0].vertexPos);
+	vertices[2].u = tileScreenInfo[i+1][j+0].tu;
+	vertices[2].v = tileScreenInfo[i+1][j+0].tv;
+	vertices[2].light = tileScreenInfo[i+1][j+0].light;
+	vertices[2].specular = tileScreenInfo[i+1][j+0].specular;
+
 	if ( onWaterEdge )
 	{
-		vertices[1].sy = tileScreenInfo[i+1][j+1].water_height;
-		vertices[2].sy = tileScreenInfo[i+1][j+0].water_height;
+		vertices[1].vertexPos.y = tileScreenInfo[i+1][j+1].water_height;
+		vertices[2].vertexPos.y = tileScreenInfo[i+1][j+0].water_height;
 	}
 
 
@@ -4447,14 +4485,14 @@
 	/* Outline the tile if necessary */
 	if(!onWaterEdge && terrainOutline)
 	{
-		iV_Line(tileScreenInfo[i+0][j+0].sx, tileScreenInfo[i+0][j+0].sy,
-			tileScreenInfo[i+0][j+1].sx, tileScreenInfo[i+0][j+1].sy, 255);
-		iV_Line(tileScreenInfo[i+0][j+1].sx, tileScreenInfo[i+0][j+1].sy,
-			tileScreenInfo[i+1][j+1].sx, tileScreenInfo[i+1][j+1].sy, 255);
-		iV_Line(tileScreenInfo[i+1][j+1].sx, tileScreenInfo[i+1][j+1].sy,
-			tileScreenInfo[i+1][j+0].sx, tileScreenInfo[i+1][j+0].sy, 255);
-		iV_Line(tileScreenInfo[i+1][j+0].sx, tileScreenInfo[i+1][j+0].sy,
-			tileScreenInfo[i+0][j+0].sx, tileScreenInfo[i+0][j+0].sy, 255);
+		iV_Line(tileScreenInfo[i+0][j+0].position.z,tileScreenInfo[i+0][j+0].position.y,
+			tileScreenInfo[i+0][j+1].position.z,tileScreenInfo[i+0][j+1].position.y,255);
+		iV_Line(tileScreenInfo[i+0][j+1].position.z,tileScreenInfo[i+0][j+1].position.y,
+			tileScreenInfo[i+1][j+1].position.z,tileScreenInfo[i+1][j+1].position.y,255);
+		iV_Line(tileScreenInfo[i+1][j+1].position.z,tileScreenInfo[i+1][j+1].position.y,
+			tileScreenInfo[i+1][j+0].position.z,tileScreenInfo[i+1][j+0].position.y,255);
+		iV_Line(tileScreenInfo[i+1][j+0].position.z,tileScreenInfo[i+1][j+0].position.y,
+			tileScreenInfo[i+0][j+0].position.z,tileScreenInfo[i+0][j+0].position.y,255);
 	}
 
 	if(!onWaterEdge && bOutlined)
@@ -4514,44 +4552,56 @@
 		offset.x = tileTexInfo[tileNumber & TILE_NUMMASK].xOffset * 64;
 		offset.y = tileTexInfo[tileNumber & TILE_NUMMASK].yOffset * 64;
 
-		tileScreenInfo[i+0][j+0].tu = (UWORD)(offset.x + 1);
-		tileScreenInfo[i+0][j+0].tv = (UWORD)(offset.y);
+		tileScreenInfo[i+0][j+0].tu = (float)(offset.x + 1);
+		tileScreenInfo[i+0][j+0].tv = (float)(offset.y);
 
-		tileScreenInfo[i+0][j+1].tu = (UWORD)(offset.x + 63);
-		tileScreenInfo[i+0][j+1].tv = (UWORD)(offset.y);
+		tileScreenInfo[i+0][j+1].tu = (float)(offset.x + 63);
+		tileScreenInfo[i+0][j+1].tv = (float)(offset.y);
 
-		tileScreenInfo[i+1][j+1].tu = (UWORD)(offset.x + 63);
-		tileScreenInfo[i+1][j+1].tv = (UWORD)(offset.y + 31);
+		tileScreenInfo[i+1][j+1].tu = (float)(offset.x + 63);
+		tileScreenInfo[i+1][j+1].tv = (float)(offset.y + 31);
 
-		tileScreenInfo[i+1][j+0].tu = (UWORD)(offset.x + 1);
-		tileScreenInfo[i+1][j+0].tv = (UWORD)(offset.y + 31);
+		tileScreenInfo[i+1][j+0].tu = (float)(offset.x + 1);
+		tileScreenInfo[i+1][j+0].tv = (float)(offset.y + 31);
 
 
-		memcpy(&vertices[0], &tileScreenInfo[i+0][j+0], sizeof(PIEVERTEX));
-		vertices[0].sy = tileScreenInfo[i+0][j+0].water_height;
+		vertices[0].vertexPos = Vector3iToVector3f(tileScreenInfo[i+0][j+0].vertexPos);
+		vertices[0].vertexPos.y = tileScreenInfo[i+0][j+0].water_height;
+		vertices[0].u = tileScreenInfo[i+0][j+0].tu;
+		vertices[0].v = tileScreenInfo[i+0][j+0].tv;
 		vertices[0].light = tileScreenInfo[i+0][j+0].wlight;
 		vertices[0].light.byte.a = WATER_ALPHA_LEVEL;
+		vertices[0].specular = tileScreenInfo[i+0][j+0].specular;
 
-		memcpy(&vertices[1], &tileScreenInfo[i+0][j+1], sizeof(PIEVERTEX));
-		vertices[1].sy = tileScreenInfo[i+0][j+1].water_height;
+		vertices[1].vertexPos = Vector3iToVector3f(tileScreenInfo[i+0][j+1].vertexPos);
+		vertices[1].vertexPos.y = tileScreenInfo[i+0][j+1].water_height;
+		vertices[1].u = tileScreenInfo[i+0][j+1].tu;
+		vertices[1].v = tileScreenInfo[i+0][j+1].tv;
 		vertices[1].light = tileScreenInfo[i+0][j+1].wlight;
 		vertices[1].light.byte.a = WATER_ALPHA_LEVEL;
+		vertices[1].specular = tileScreenInfo[i+0][j+1].specular;
 
-		memcpy(&vertices[2], &tileScreenInfo[i+1][j+1], sizeof(PIEVERTEX));
-		vertices[2].sy = tileScreenInfo[i+1][j+1].water_height;
+		vertices[2].vertexPos = Vector3iToVector3f(tileScreenInfo[i+1][j+1].vertexPos);
+		vertices[2].vertexPos.y = tileScreenInfo[i+1][j+1].water_height;
+		vertices[2].u = tileScreenInfo[i+1][j+1].tu;
+		vertices[2].v = tileScreenInfo[i+1][j+1].tv;
 		vertices[2].light = tileScreenInfo[i+1][j+1].wlight;
 		vertices[2].light.byte.a = WATER_ALPHA_LEVEL;
+		vertices[2].specular = tileScreenInfo[i+1][j+1].specular;
 
 		pie_SetDepthOffset(-1.0);
 
 		pie_DrawTexTriangle(vertices, &waterRealValue);
 
+		memcpy(&vertices[1], &vertices[2], sizeof(PIEVERTEX));
 
-		memcpy(&vertices[1], &vertices[2], sizeof(PIEVERTEX));
-		memcpy(&vertices[2], &tileScreenInfo[i+1][j+0], sizeof(PIEVERTEX));
-		vertices[2].sy = tileScreenInfo[i+1][j+0].water_height;
+		vertices[2].vertexPos = Vector3iToVector3f(tileScreenInfo[i+1][j+0].vertexPos);
+		vertices[2].vertexPos.y = tileScreenInfo[i+1][j+0].water_height;
+		vertices[2].u = tileScreenInfo[i+1][j+0].tu;
+		vertices[2].v = tileScreenInfo[i+1][j+0].tv;
 		vertices[2].light = tileScreenInfo[i+1][j+0].wlight;
 		vertices[2].light.byte.a = WATER_ALPHA_LEVEL;
+		vertices[2].specular = tileScreenInfo[i+1][j+0].specular;
 
 		pie_DrawTexTriangle(vertices, &waterRealValue);
 
@@ -4560,9 +4610,6 @@
 }
 
 
-
-
-// -------------------------------------------------------------------------------------
 UDWORD	getSuggestedPitch( void )
 {
 	UDWORD	worldAngle;
@@ -5331,6 +5378,7 @@
 {
 	PIEVERTEX	pts[3];
 	Vector3i each;
+	Vector3i tmpVector3i;
 	Vector3i *point;
 	UDWORD	pointIndex;
 	SDWORD	realY;
@@ -5350,12 +5398,13 @@
 
 	rx = player.p.x & (TILE_UNITS-1);
 	rz = player.p.z & (TILE_UNITS-1);
-	pts[0].sx = vec.x + rx;
-	pts[0].sy = vec.y;
-	pts[0].sz = vec.z - rz;
+	pts[0].vertexPos.x = vec.x + rx;
+	pts[0].vertexPos.y = vec.y;
+	pts[0].vertexPos.z = vec.z - rz;
 
 	pointIndex = rand()%(psStructure->sDisplay.imd->npoints-1);
-	point = &(psStructure->sDisplay.imd->points[pointIndex]);
+	tmpVector3i= Vector3fToVector3i(psStructure->sDisplay.imd->points[pointIndex]);
+	point = &tmpVector3i;
 
 	each.x = psStructure->x + point->x;
 	realY = MAKEINT((structHeightScale(psStructure) * point->y));
@@ -5374,12 +5423,13 @@
 
 	rx = player.p.x & (TILE_UNITS-1);
 	rz = player.p.z & (TILE_UNITS-1);
-	pts[1].sx = vec.x + rx;
-	pts[1].sy = vec.y;
-	pts[1].sz = vec.z - rz;
+	pts[1].vertexPos.x = vec.x + rx;
+	pts[1].vertexPos.y = vec.y;
+	pts[1].vertexPos.z = vec.z - rz;
 
 	pointIndex = rand()%(psStructure->sDisplay.imd->npoints-1);
-	point = &(psStructure->sDisplay.imd->points[pointIndex]);
+	tmpVector3i = Vector3fToVector3i(psStructure->sDisplay.imd->points[pointIndex]);
+	point = &tmpVector3i;
 
 	each.x = psStructure->x + point->x;
 	realY = MAKEINT((structHeightScale(psStructure) * point->y));
@@ -5392,9 +5442,9 @@
 
 	rx = player.p.x & (TILE_UNITS-1);
 	rz = player.p.z & (TILE_UNITS-1);
-	pts[2].sx = vec.x + rx;
-	pts[2].sy = vec.y;
-	pts[2].sz = vec.z - rz;
+	pts[2].vertexPos.x = vec.x + rx;
+	pts[2].vertexPos.y = vec.y;
+	pts[2].vertexPos.z = vec.z - rz;
 
 	// set the colour
 	colour = UBYTE_MAX;
@@ -5409,16 +5459,16 @@
 	pts[1].light.argb = 0xff000000;
 	pts[2].light.argb = 0xff000000;
 
-	pts[0].tu = 0;
-	pts[0].tv = 0;
+	pts[0].u = 0;
+	pts[0].v = 0;
 	pts[0].specular.argb = colour;
 
-	pts[1].tu = 0;
-	pts[1].tv = 0;
+	pts[1].u = 0;
+	pts[1].v = 0;
 	pts[1].specular.argb = 0;
 
-	pts[2].tu = 0;
-	pts[2].tv = 0;
+	pts[2].u = 0;
+	pts[2].v = 0;
 	pts[2].specular.argb = 0;
 
 
Index: src/display3d.h
===================================================================
--- src/display3d.h	(revision 1313)
+++ src/display3d.h	(working copy)
@@ -125,10 +125,11 @@
 // Expanded PIEVERTEX.
 typedef struct {
 	// PIEVERTEX.
-	SDWORD x, y, z; UWORD tu, tv; PIELIGHT light, specular;
+	Vector3i vertexPos; float tu, tv; PIELIGHT light, specular;
+	// position
+	Vector3i position;
 	// Extra data for water.
-	SDWORD sx, sy, sz;
-	SDWORD wx, wy, wz;
+	Vector3i waterPos;
 	SDWORD water_height;
 	PIELIGHT wlight;
 	UBYTE drawInfo;
Index: lib/ivis_common/ivisdef.h
===================================================================
--- lib/ivis_common/ivisdef.h	(revision 1313)
+++ lib/ivis_common/ivisdef.h	(working copy)
@@ -125,9 +125,9 @@
 	Uint32 flags;
 	Sint32 zcentre;
 	int npnts;
-	Vector3i normal;
+	Vector3f normal;
 	VERTEXID *pindex;
-	iVertex *vrt;
+	fVertex *vrt;
 	iTexAnim *pTexAnim;		// warning.... this is not used on the playstation version !
 } iIMDPoly;
 
@@ -142,9 +142,9 @@
 	int npolys;					// After BSP this number is not updated - it stays the number of pre-bsp polys
 	int nconnectors;			// After BSP this number is not updated - it stays the number of pre-bsp polys
 
-   Vector3i *points;
+   Vector3f *points;
    iIMDPoly *polys;		// After BSP this is not changed - it stays the original chunk of polys - not all are now used,and others not in this array are, see BSPNode for a tree of all the post BSP polys
-   Vector3i *connectors;		// After BSP this is not changed - it stays the original chunk of polys - not all are now used,and others not in this array are, see BSPNode for a tree of all the post BSP polys
+   Vector3f *connectors;		// After BSP this is not changed - it stays the original chunk of polys - not all are now used,and others not in this array are, see BSPNode for a tree of all the post BSP polys
 
 	int ntexanims;
 	iTexAnim **texanims;
Index: lib/ivis_common/piedef.h
===================================================================
--- lib/ivis_common/piedef.h	(revision 1313)
+++ lib/ivis_common/piedef.h	(working copy)
@@ -127,7 +127,7 @@
 #endif
 typedef union  {PIELIGHTBYTES byte; UDWORD argb;} PIELIGHT;
 typedef struct {UBYTE r, g, b, a;} PIEVERTLIGHT;
-typedef struct {SDWORD sx, sy, sz; UWORD tu, tv; PIELIGHT light, specular;} PIEVERTEX;
+typedef struct {Vector3f vertexPos; float u, v; PIELIGHT light, specular;} PIEVERTEX;
 
 typedef struct {SWORD x, y, w, h;} PIERECT; //screen rectangle
 typedef struct {SDWORD texPage; SWORD tu, tv, tw, th;} PIEIMAGE; //an area of texture
@@ -170,6 +170,10 @@
 
 extern void pie_GetResetCounts(SDWORD* pPieCount, SDWORD* pTileCount, SDWORD* pPolyCount, SDWORD* pStateCount);
 
+extern Vector3i Vector3fToVector3i(Vector3f v);
+
+extern Vector3f Vector3iToVector3f(Vector3i v);
+
 void pie_BeginLighting(float x, float y, float z);
 void pie_EndLighting(void);
 void pie_RemainingPasses(void);
Index: lib/ivis_common/pietypes.h
===================================================================
--- lib/ivis_common/pietypes.h	(revision 1313)
+++ lib/ivis_common/pietypes.h	(working copy)
@@ -49,7 +49,8 @@
 typedef struct { float x, y, z; } Vector3f;
 
 typedef struct { Vector3i p, r; } iView;
-typedef struct { Sint32 x, y, z, u, v; Uint8 g; } iVertex;
+typedef struct { Vector3i vertexPos; float u, v; Uint8 g; } iVertex;
+typedef struct { Vector3f vertexPos; float u, v; Uint8 g; } fVertex;
 
 typedef struct { Uint8 r, g, b; } iColour;
 typedef iColour iPalette[256];
Index: lib/ivis_common/imdload.c
===================================================================
--- lib/ivis_common/imdload.c	(revision 1313)
+++ lib/ivis_common/imdload.c	(working copy)
@@ -221,7 +221,7 @@
 	char *pFileData = *ppFileData;
 	int cnt;
 	int i, j; //, anim;
-	Vector3i p0, p1, p2, *points;
+	Vector3f p0, p1, p2, *points;
 	iIMDPoly *poly;
 	int	nFrames,pbRate,tWidth,tHeight;
 
@@ -247,9 +247,9 @@
 			poly->flags=flags;
 			poly->npnts=npnts;
 
-			poly->pindex = (VERTEXID *) malloc(sizeof(VERTEXID) * poly->npnts);
+			poly->pindex = (VERTEXID *)malloc(sizeof(VERTEXID) * poly->npnts);
 
-			if ((poly->vrt = (iVertex *)	malloc(sizeof(iVertex) * poly->npnts)) == NULL) {
+			if ((poly->vrt = (fVertex *)malloc(sizeof(fVertex) * poly->npnts)) == NULL) {
 				iV_Error(0xff,"(_load_polys) [poly %d] memory alloc fail (vertex struct)",i);
 				return FALSE;
 			}
@@ -284,7 +284,7 @@
 				p2.y = points[poly->pindex[poly->npnts-1]].y;
 				p2.z = points[poly->pindex[poly->npnts-1]].z;
 
-				pie_SurfaceNormal3iv(&p0,&p1,&p2,&poly->normal);
+				pie_SurfaceNormal3fv(&p0,&p1,&p2,&poly->normal);
 				//iV_DEBUG3("normal %d %d %d\n",poly->normal.x,poly->normal.y,poly->normal.z);
 			} else {
 				poly->normal.x = poly->normal.y = poly->normal.z = 0;
@@ -330,8 +330,8 @@
 			if (poly->vrt && (poly->flags & iV_IMD_TEX))
 			{
 				for (j=0; j<poly->npnts; j++) {
-					Sint32 VertexU, VertexV;
-					if (sscanf(pFileData, "%d %d%n", &VertexU, &VertexV, &cnt) != 2) {
+					float VertexU, VertexV;
+					if (sscanf(pFileData, "%f %f%n", &VertexU, &VertexV, &cnt) != 2) {
 						iV_Error(0xff,"(_load_polys) [poly %d] error reading tex outline",i);
 						return FALSE;
 					}
@@ -356,16 +356,16 @@
 	char *pFileData = *ppFileData;
 	int cnt;
 	int i;
-	Vector3i *p;
-	int lastPoint,match,j;
-	SDWORD newX,newY,newZ;
+	Vector3f *p;
+	int lastPoint, match, j;
+	float newX, newY, newZ;
 
 	p = s->points;
 
 	lastPoint = 0;
 
 	for (i = 0; i < s->npoints; i++) {
-		if (sscanf(pFileData, "%d %d %d%n", &(newX), &(newY), &(newZ), &cnt) != 3) {
+		if (sscanf(pFileData, "%f %f %f%n", &newX, &newY, &newZ, &cnt) != 3) {
 			iV_Error(0xff,"(_load_points) file corrupt -K");
 			return FALSE;
 		}
@@ -428,9 +428,9 @@
 static BOOL _imd_load_points( char **ppFileData, iIMDShape *s )
 {
 	int i ;
-	Vector3i *p;
-	Sint32 tempXMax, tempXMin, tempZMax, tempZMin, extremeX, extremeZ;
-	Sint32 xmax, ymax, zmax;
+	Vector3f *p;
+	float tempXMax, tempXMin, tempZMax, tempZMin, extremeX, extremeZ;
+	float xmax, ymax, zmax;
 	double dx, dy, dz, rad_sq, rad, old_to_p_sq, old_to_p, old_to_new;
 	double xspan, yspan, zspan, maxspan;
 	Vector3f dia1, dia2, cen;
@@ -439,7 +439,7 @@
 
 	//load the points then pass through a second time to setup bounding datavalues
 
-	s->points = p = (Vector3i *) malloc(sizeof(Vector3i) * s->npoints);
+	s->points = p = (Vector3f *)malloc(sizeof(Vector3f) * s->npoints);
 	if (p == NULL) {
 		return FALSE;
 	}
@@ -549,10 +549,8 @@
 		zmax = MAX(s->zmax, -s->zmin);
 
 		s->radius = MAX(xmax, (MAX(ymax, zmax)));
+		s->sradius = sqrtf( xmax*xmax + ymax*ymax + zmax*zmax);
 
-
-		s->sradius = (SDWORD)sqrtf( xmax*xmax + ymax*ymax + zmax*zmax);
-
 // START: tight bounding sphere
 
 		// set xspan = distance between 2 points xmin & xmax (squared)
@@ -639,8 +637,8 @@
 		s->ocen.x = (Sint32) cen.x;
 		s->ocen.y = (Sint32) cen.y;
 		s->ocen.z = (Sint32) cen.z;
-		s->oradius = (Sint32) rad;
-		iV_DEBUG2("radius, sradius, %d, %d\n", s->radius, s->sradius);
+		s->oradius = (float) rad;
+		iV_DEBUG2("radius, sradius, %f, %f\n",s->radius,s->sradius);
 		iV_DEBUG4("SPHERE: cen,rad = %d %d %d,  %d\n", s->ocen.x, s->ocen.y, s->ocen.z, s->oradius);
 
 // END: tight bounding sphere
@@ -653,10 +651,10 @@
 	char *pFileData = *ppFileData;
 	int cnt;
 	int i;
-	Vector3i *p;
-	SDWORD newX,newY,newZ;
+	Vector3f *p;
+	float newX, newY, newZ;
 
-	if ((s->connectors = (Vector3i *) malloc(sizeof(Vector3i) * s->nconnectors)) == NULL)
+	if ((s->connectors = (Vector3f *)malloc(sizeof(Vector3f) * s->nconnectors)) == NULL)
 	{
 		iV_Error(0xff,"(_load_connectors) MALLOC fail");
 		return FALSE;
@@ -666,7 +664,7 @@
 
 	for (i=0; i<s->nconnectors; i++, p++)
 	{
-		if (sscanf(pFileData,"%d %d %d%n",&(newX),&(newY),&(newZ),&cnt) != 3)
+		if (sscanf(pFileData, "%f %f %f%n", &newX, &newY, &newZ, &cnt) != 3)
 		{
 			iV_Error(0xff,"(_load_connectors) file corrupt -M");
 			return FALSE;
Index: lib/ivis_common/pieclip.c
===================================================================
--- lib/ivis_common/pieclip.c	(revision 1313)
+++ lib/ivis_common/pieclip.c	(working copy)
@@ -66,56 +66,57 @@
 
 static void pie_ClipUV(PIEVERTEX *s1, PIEVERTEX *s2, PIEVERTEX *clip, Sint32 t)
 {
-	clip->tu = s1->tu + ((t * (s2->tu - s1->tu)) >> iV_DIVSHIFT);
-	clip->tv = s1->tv + ((t * (s2->tv - s1->tv)) >> iV_DIVSHIFT);
-	clip->sz = s1->sz + ((t * (s2->sz - s1->sz)) >> iV_DIVSHIFT);
-	clip->light.byte.r = s1->light.byte.r + ((t * (s2->light.byte.r - s1->light.byte.r)) >> iV_DIVSHIFT);
-	clip->light.byte.g = s1->light.byte.g + ((t * (s2->light.byte.g - s1->light.byte.g)) >> iV_DIVSHIFT);
-	clip->light.byte.b = s1->light.byte.b + ((t * (s2->light.byte.b - s1->light.byte.b)) >> iV_DIVSHIFT);
-	clip->light.byte.a = s1->light.byte.a + ((t * (s2->light.byte.a - s1->light.byte.a)) >> iV_DIVSHIFT);
+	clip->u = s1->u + t * (s2->u - s1->u) / iV_DIVMULTP;
+	clip->v = s1->v + t * (s2->v - s1->v) / iV_DIVMULTP;
+
+	clip->vertexPos.z = s1->vertexPos.z + t * (s2->vertexPos.z - s1->vertexPos.z) / iV_DIVMULTP;
+	clip->light.byte.r = s1->light.byte.r + t * (s2->light.byte.r - s1->light.byte.r) / iV_DIVMULTP;
+	clip->light.byte.g = s1->light.byte.g + t * (s2->light.byte.g - s1->light.byte.g) / iV_DIVMULTP;
+	clip->light.byte.b = s1->light.byte.b + t * (s2->light.byte.b - s1->light.byte.b) / iV_DIVMULTP;
+	clip->light.byte.a = s1->light.byte.a + t * (s2->light.byte.a - s1->light.byte.a) / iV_DIVMULTP;
 }
 
 static int pie_ClipXT(PIEVERTEX *s1, PIEVERTEX *s2, PIEVERTEX *clip)
 {
-	int n = 1, dx;
+	int n = 1, dx = 0;
 	Sint32 t;
 
-	if (s2->sx >= s1->sx) {
-		if (s1->sx < psRendSurface->clip.left) {
-			if (s2->sx <= psRendSurface->clip.left)
+	if (s2->vertexPos.x >= s1->vertexPos.x) {
+		if (s1->vertexPos.x < psRendSurface->clip.left) {
+			if (s2->vertexPos.x <= psRendSurface->clip.left)
 				return 0;
 
-			dx = s2->sx - s1->sx;
+			dx = s2->vertexPos.x - s1->vertexPos.x;
 
 			if (dx != 0)
-				clip->sy = s1->sy + (s2->sy - s1->sy) * (psRendSurface->clip.left - s1->sx) / dx;
+				clip->vertexPos.y = s1->vertexPos.y + (s2->vertexPos.y - s1->vertexPos.y) * (psRendSurface->clip.left - s1->vertexPos.x) / dx;
 			else
-				clip->sy = s1->sy;
+				clip->vertexPos.y = s1->vertexPos.y;
 
-			clip->sx = psRendSurface->clip.left;
+			clip->vertexPos.x = psRendSurface->clip.left;
 
 			// clip uv
-			t = ((clip->sx - s1->sx)<<iV_DIVSHIFT) / dx;
+			t = (clip->vertexPos.x - s1->vertexPos.x) * iV_DIVMULTP / dx;
 			pie_ClipUV(s1, s2, clip, t);
 		} else
 			*clip = *s1;
 
-		if (s2->sx > psRendSurface->clip.right) {
-			if (s1->sx > psRendSurface->clip.right)
+		if (s2->vertexPos.x > psRendSurface->clip.right) {
+			if (s1->vertexPos.x > psRendSurface->clip.right)
 				return 0;
 
 			clip++;
-			dx = s2->sx - s1->sx;
+			dx = s2->vertexPos.x - s1->vertexPos.x;
 
 			if (dx != 0)
-				clip->sy = s2->sy - (s2->sy - s1->sy) * (s2->sx - psRendSurface->clip.right) / dx;
+				clip->vertexPos.y = ((SDWORD)s2->vertexPos.y - (s2->vertexPos.y - s1->vertexPos.y) * (s2->vertexPos.x - psRendSurface->clip.right) / dx);
 			else
-				clip->sy = s2->sy;
+				clip->vertexPos.y = s2->vertexPos.y;
 
-			clip->sx = psRendSurface->clip.right;
+			clip->vertexPos.x = psRendSurface->clip.right;
 
 			// clip uv
-			t = ((clip->sx - s1->sx)<<iV_DIVSHIFT) / dx;
+			t = (clip->vertexPos.x - s1->vertexPos.x) * iV_DIVMULTP / dx;
 			pie_ClipUV(s1, s2, clip, t);
 
 			n = 2;
@@ -123,42 +124,43 @@
 		return n;
 
 	} else {
-		if (s1->sx > psRendSurface->clip.right) {
+		if (s1->vertexPos.x > psRendSurface->clip.right) {
 
-			if (s2->sx >= psRendSurface->clip.right) return 0;
+			if (s2->vertexPos.x >= psRendSurface->clip.right)
+				return 0;
 
-			dx = s1->sx - s2->sx;
+			dx = s1->vertexPos.x - s2->vertexPos.x;
 
 			if (dx != 0)
-				clip->sy = s1->sy - (s1->sy - s2->sy) * (s1->sx - psRendSurface->clip.right) / dx;
+				clip->vertexPos.y = s1->vertexPos.y - (s1->vertexPos.y - s2->vertexPos.y) * (s1->vertexPos.x - psRendSurface->clip.right) / dx;
 			else
-				clip->sy = s1->sy;
+				clip->vertexPos.y = s1->vertexPos.y;
 
-			clip->sx = psRendSurface->clip.right;
+			clip->vertexPos.x = psRendSurface->clip.right;
 
 			// clip uv
-			t = ((clip->sx - s1->sx)<<iV_DIVSHIFT) / dx;
+			t = (clip->vertexPos.x - s1->vertexPos.x) * iV_DIVSHIFT / dx;
 			pie_ClipUV(s1, s2, clip, t);
 		} else {
 			*clip = *s1;
 		}
 
-		if (s2->sx < psRendSurface->clip.left) {
-			if (s1->sx < psRendSurface->clip.left)
+		if (s2->vertexPos.x < psRendSurface->clip.left) {
+			if (s1->vertexPos.x < psRendSurface->clip.left)
 				return 0;
 
 			clip++;
-			dx = s1->sx - s2->sx;
+			dx = s1->vertexPos.x - s2->vertexPos.x;
 
 			if (dx != 0)
-				clip->sy = s2->sy + (s1->sy - s2->sy) * (psRendSurface->clip.left - s2->sx) / dx;
+				clip->vertexPos.y = s2->vertexPos.y + (s1->vertexPos.y - s2->vertexPos.y) * (psRendSurface->clip.left - s2->vertexPos.x) / dx;
 			else
-				clip->sy = s2->sy;
+				clip->vertexPos.y = s2->vertexPos.y;
 
-			clip->sx = psRendSurface->clip.left;
+			clip->vertexPos.x = psRendSurface->clip.left;
 
 			// clip uv
-			t = ((clip->sx - s1->sx)<<iV_DIVSHIFT) / dx;
+			t = (clip->vertexPos.x - s1->vertexPos.x) * iV_DIVSHIFT / dx;
 			pie_ClipUV(s1, s2, clip, t);
 
 			n = 2;
@@ -172,48 +174,49 @@
 	int n = 1, dy;
 	Sint32 t;
 
-	if (s2->sy >= s1->sy) {
+	if (s2->vertexPos.y >= s1->vertexPos.y) {
 
-		if (s1->sy < psRendSurface->clip.top) {
+		if (s1->vertexPos.y < psRendSurface->clip.top) {
 
-			if (s2->sy <= psRendSurface->clip.top) return 0;
+			if (s2->vertexPos.y <= psRendSurface->clip.top)
+				return 0;
 
-			dy = s2->sy - s1->sy;
+			dy = s2->vertexPos.y - s1->vertexPos.y;
 
 			if (dy != 0)
-				clip->sx = s1->sx + (s2->sx - s1->sx) * (psRendSurface->clip.top - s1->sy) / dy;
+				clip->vertexPos.x = s1->vertexPos.x + (s2->vertexPos.x - s1->vertexPos.x) * (psRendSurface->clip.top - s1->vertexPos.y) / dy;
 			else
-				clip->sx = s1->sx;
+				clip->vertexPos.x = s1->vertexPos.x;
 
-			clip->sy = psRendSurface->clip.top;
+			clip->vertexPos.y = psRendSurface->clip.top;
 
 			// clip uv
-			t = ((clip->sy - s1->sy)<<iV_DIVSHIFT) / dy;
+			t = (clip->vertexPos.y - s1->vertexPos.y) * iV_DIVSHIFT / dy;
 			pie_ClipUV(s1, s2, clip, t);
 		} else {
 			*clip = *s1;
 		}
 
-		if (s2->sy > psRendSurface->clip.bottom)
+		if (s2->vertexPos.y > psRendSurface->clip.bottom)
 		{
-			if (s1->sy > psRendSurface->clip.bottom)
+			if (s1->vertexPos.y > psRendSurface->clip.bottom)
 			{
 				return 0;
 			}
 			clip++;
 
-			dy = s2->sy - s1->sy;
+			dy = s2->vertexPos.x - s1->vertexPos.x;
 
 			if (dy != 0)
 			{
-				clip->sx = s2->sx - (s2->sx - s1->sx) * (s2->sy - psRendSurface->clip.bottom) / dy;
+				clip->vertexPos.x = s2->vertexPos.x - (s2->vertexPos.x - s1->vertexPos.x) * (s2->vertexPos.y - psRendSurface->clip.bottom) / dy;
 			} else {
-				clip->sx = s2->sx;
+				clip->vertexPos.x = s2->vertexPos.x;
 			}
 
-			clip->sy = psRendSurface->clip.bottom;
+			clip->vertexPos.y = psRendSurface->clip.bottom;
 
-			t = ((clip->sy - s1->sy)<<iV_DIVSHIFT) / dy;
+			t = (clip->vertexPos.y - s1->vertexPos.y) * iV_DIVSHIFT / dy;
 			pie_ClipUV(s1, s2, clip, t);
 
 			n = 2;
@@ -222,48 +225,51 @@
 		return n;
 
 	} else {
-		if (s1->sy > psRendSurface->clip.bottom)
+		if (s1->vertexPos.y > psRendSurface->clip.bottom)
 		{
-			if (s2->sy >= psRendSurface->clip.bottom) return 0;
+			if (s2->vertexPos.y >= psRendSurface->clip.bottom)
+				return 0;
 
-			dy = s1->sy - s2->sy;
+			dy = s1->vertexPos.y - s2->vertexPos.y;
 
 			if (dy != 0)
-				clip->sx = s1->sx - (s1->sx - s2->sx) * (s1->sy - psRendSurface->clip.bottom) / dy;
+				clip->vertexPos.x = s1->vertexPos.x - (s1->vertexPos.x - s2->vertexPos.x) * (s1->vertexPos.y - psRendSurface->clip.bottom) / dy;
 			else
-				clip->sx = s1->sx;
+				clip->vertexPos.x = s1->vertexPos.x;
 
-			clip->sy = psRendSurface->clip.bottom;
+			clip->vertexPos.y = psRendSurface->clip.bottom;
 
 			// clip uv
-			t = ((clip->sy - s1->sy)<<iV_DIVSHIFT) / dy;
+			t = (clip->vertexPos.y - s1->vertexPos.y) * iV_DIVSHIFT / dy;
 			pie_ClipUV(s1, s2, clip, t);
 
 		} else {
 			*clip = *s1;
 		}
 
-		if (s2->sy < psRendSurface->clip.top)
+		if (s2->vertexPos.y < psRendSurface->clip.top)
 		{
-			if (s1->sy < psRendSurface->clip.top)
+			if (s1->vertexPos.y < psRendSurface->clip.top)
 			{
 				return 0;
 			}
 
 			clip++;
 
-			dy = s1->sy - s2->sy;
+			dy = s1->vertexPos.y - s2->vertexPos.y;
 
 			if (dy != 0)
 			{
-				clip->sx = s2->sx + (s1->sx - s2->sx) * (psRendSurface->clip.top - s2->sy) / dy;
-			} else {
-				clip->sx = s2->sx;
+				clip->vertexPos.x = s2->vertexPos.x + (s1->vertexPos.x - s2->vertexPos.x) * (psRendSurface->clip.top - s2->vertexPos.y) / dy;
 			}
+			else
+			{
+				clip->vertexPos.x = s2->vertexPos.x;
+			}
 
-			clip->sy = psRendSurface->clip.top;
+			clip->vertexPos.y = psRendSurface->clip.top;
 
-			t = ((clip->sy - s1->sy)<<iV_DIVSHIFT) / dy;
+			t = (clip->vertexPos.y - s1->vertexPos.y) * iV_DIVSHIFT / dy;
 			pie_ClipUV(s1, s2, clip, t);
 
 			n = 2;
@@ -287,7 +293,7 @@
 		if (i==(npoints-1))
 			p1 = &points[0];
 
-		if ((p0->sx == 1<<15) || (p0->sy == -1<<15))//check for invalid points jps19aug97
+		if ((p0->vertexPos.x == iV_DIVMULTP) || (p0->vertexPos.y == -iV_DIVMULTP))//check for invalid points jps19aug97
 			return 0;
 
 		n1 += pie_ClipXT(p0,p1,&xclip[n1]);
@@ -318,21 +324,21 @@
 	UDWORD	i;
 
 	numPreY = 0;
-	if( (v1->sx > LONG_TEST) || (v1->sy > LONG_TEST) )
+	if( (v1->vertexPos.x > LONG_TEST) || (v1->vertexPos.y > LONG_TEST) )
 	{
 		/* bomb out for out of range points */
 		return(0);
 	}
 	numPreY += pie_ClipXT(v1,v2,&xClip[numPreY]);
 
-	if( (v2->sx > LONG_TEST) || (v2->sy > LONG_TEST) )
+	if( (v2->vertexPos.x > LONG_TEST) || (v2->vertexPos.y > LONG_TEST) )
 	{
 		/* bomb out for out of range points */
 		return(0);
 	}
 	numPreY += pie_ClipXT(v2,v3,&xClip[numPreY]);
 
-	if( (v3->sx > LONG_TEST) || (v3->sy > LONG_TEST) )
+	if( (v3->vertexPos.x > LONG_TEST) || (v3->vertexPos.y > LONG_TEST) )
 	{
 		/* bomb out for out of range points */
 		return(0);
Index: lib/framework/types.h
===================================================================
--- lib/framework/types.h	(revision 1313)
+++ lib/framework/types.h	(working copy)
@@ -61,7 +61,7 @@
 
 #ifndef WZ_OS_WIN
 
-typedef int BOOL;
+typedef int BOOL; // FIXME Should be uint8_t and defined for Windows as well.
 
 typedef struct
 {
Index: lib/ivis_opengl/piematrix.c
===================================================================
--- lib/ivis_opengl/piematrix.c	(revision 1316)
+++ lib/ivis_opengl/piematrix.c	(working copy)
@@ -474,14 +474,14 @@
 
 BOOL pie_Clockwise(iVertex *s)
 {
-	return (((s[1].y - s[0].y) * (s[2].x - s[1].x)) <=
-			((s[1].x - s[0].x) * (s[2].y - s[1].y)));
+	return (((s[1].vertexPos.y - s[0].vertexPos.y) * (s[2].vertexPos.x - s[1].vertexPos.x)) <=
+			((s[1].vertexPos.x - s[0].vertexPos.x) * (s[2].vertexPos.y - s[1].vertexPos.y)));
 }
 
 BOOL pie_PieClockwise(PIEVERTEX *s)
 {
-	return (((s[1].sy - s[0].sy) * (s[2].sx - s[1].sx)) <=
-			((s[1].sx - s[0].sx) * (s[2].sy - s[1].sy)));
+	return (((s[1].vertexPos.y - s[0].vertexPos.y) * (s[2].vertexPos.x - s[1].vertexPos.x)) <=
+			((s[1].vertexPos.x - s[0].vertexPos.x) * (s[2].vertexPos.y - s[1].vertexPos.y)));
 }
 
 
Index: lib/ivis_opengl/piefunc.c
===================================================================
--- lib/ivis_opengl/piefunc.c	(revision 1313)
+++ lib/ivis_opengl/piefunc.c	(working copy)
@@ -76,14 +76,14 @@
 	pie_SetTexturePage(-1);
 	pie_SetRendMode(REND_ALPHA_FLAT);
 //PIE verts
-	pieVrts[0].sx = v[1].x;
-	pieVrts[0].sy = v[1].y;
+	pieVrts[0].vertexPos.x = (float)v[1].x;
+	pieVrts[0].vertexPos.y = (float)v[1].y;
 	//cull triangles with off screen points
-	pieVrts[0].sz  = (SDWORD)INTERFACE_DEPTH;
+	pieVrts[0].vertexPos.z  = (float)INTERFACE_DEPTH;
 
 
-	pieVrts[0].tu = (UWORD)0.0;
-	pieVrts[0].tv = (UWORD)0.0;
+	pieVrts[0].u = 0.0f;
+	pieVrts[0].v = 0.0f;
 	pieVrts[0].light.argb = colour;//0x7fffffff;
 	pieVrts[0].specular.argb = 0;
 
@@ -92,14 +92,14 @@
 	memcpy(&pieVrts[3],&pieVrts[0],sizeof(PIEVERTEX));
 	memcpy(&pieVrts[4],&pieVrts[0],sizeof(PIEVERTEX));
 
-	pieVrts[1].sx = v[0].x;
-	pieVrts[1].sy = v[0].y;
+	pieVrts[1].vertexPos.x = (float)v[0].x;
+	pieVrts[1].vertexPos.y = (float)v[0].y;
 
-	pieVrts[2].sx = v[2].x;
-	pieVrts[2].sy = v[2].y;
+	pieVrts[2].vertexPos.x = (float)v[2].x;
+	pieVrts[2].vertexPos.y = (float)v[2].y;
 
-	pieVrts[3].sx = v[3].x;
-	pieVrts[3].sy = v[3].y;
+	pieVrts[3].vertexPos.x = (float)v[3].x;
+	pieVrts[3].vertexPos.y = (float)v[3].y;
 
 	pie_Set2DClip(x1,y1,x2-1,y2-1);
 	clip = pie_ClipTextured(4, &pieVrts[0], &clippedVrts[0]);
@@ -112,15 +112,15 @@
 		glBegin(GL_TRIANGLE_FAN);
 		glColor4ub(c.byte.r, c.byte.g, c.byte.b, c.byte.a >> 1);
 		for (i = 0; i < clip; i++) {
-			glVertex2f(clippedVrts[i].sx, clippedVrts[i].sy);
+			glVertex2f(clippedVrts[i].vertexPos.x, clippedVrts[i].vertexPos.y);
 		}
 		glEnd();
 		glBegin(GL_LINE_STRIP);
 		glColor4ub(c.byte.r, c.byte.g, c.byte.b, c.byte.a);
 		for (i = 0; i < clip; i++) {
-			glVertex2f(clippedVrts[i].sx, clippedVrts[i].sy);
+			glVertex2f(clippedVrts[i].vertexPos.x, clippedVrts[i].vertexPos.y);
 		}
-		glVertex2f(clippedVrts[0].sx, clippedVrts[0].sy);
+		glVertex2f(clippedVrts[0].vertexPos.x, clippedVrts[0].vertexPos.y);
 		glEnd();
 	}
 }
@@ -128,7 +128,7 @@
 /* ---------------------------------------------------------------------------------- */
 void pie_TransColouredTriangle( PIEVERTEX *vrt, UDWORD rgb )
 {
-        PIELIGHT c;
+	PIELIGHT c;
 	UDWORD i;
 
 	c.argb = rgb;
@@ -136,13 +136,14 @@
 	pie_SetTexturePage(-1);
 	pie_SetRendMode(REND_ALPHA_ITERATED);
 
-        glBegin(GL_TRIANGLE_FAN);
-        glColor4ub(c.byte.r, c.byte.g, c.byte.b, 128);
-        for (i = 0; i < 3; ++i)
-        {
-		glVertex3f(vrt[i].sx, vrt[i].sy, vrt[i].sz);
+	glBegin(GL_TRIANGLE_FAN);
+	glColor4ub(c.byte.r, c.byte.g, c.byte.b, 128);
+	for (i = 0; i < 3; ++i)
+	{
+		glVertex3f(vrt[i].vertexPos.x, vrt[i].vertexPos.y, vrt[i].vertexPos.z);
 	}
-        glEnd();}
+	glEnd();
+}
 
 /* ---------------------------------------------------------------------------------- */
 
@@ -168,7 +169,7 @@
 	glDisable(GL_ALPHA_TEST);
 
 	// Apply scale matrix
-	glScalef(scale,scale / 2.0,scale);
+	glScalef(scale, scale/2.0f, scale);
 
 	glBegin(GL_QUAD_STRIP);
 		// Front
Index: lib/ivis_opengl/piedraw.c
===================================================================
--- lib/ivis_opengl/piedraw.c	(revision 1313)
+++ lib/ivis_opengl/piedraw.c	(working copy)
@@ -196,6 +196,29 @@
 	lighting = FALSE;
 }
 
+
+Vector3i Vector3fToVector3i(Vector3f v)
+{
+	Vector3i result;
+
+	result.x = (SDWORD)v.x;
+	result.y = (SDWORD)v.y;
+	result.z = (SDWORD)v.z;
+	return result;
+}
+
+
+Vector3f Vector3iToVector3f(Vector3i v)
+{
+	Vector3f result;
+
+	result.x = (float)v.x;
+	result.y = (float)v.y;
+	result.z = (float)v.z;
+	return result;
+}
+
+
 static inline void Vector3f_Set(Vector3f* v, float x, float y, float z)
 {
 	v->x = x;
@@ -250,14 +273,11 @@
 		}
 		glBegin(GL_TRIANGLE_FAN);
 		if (light) {
-			Vector3f p1, p2, p3, v1, v2, n;
+			Vector3f v1, v2, n;
 			float l;
 
-			Vector3f_Set(&p1, pVrts[0].sx, pVrts[0].sy, pVrts[0].sz);
-			Vector3f_Set(&p2, pVrts[1].sx, pVrts[1].sy, pVrts[1].sz);
-			Vector3f_Set(&p3, pVrts[2].sx, pVrts[2].sy, pVrts[2].sz);
-			Vector3f_Sub(&v1, &p3, &p1);
-			Vector3f_Sub(&v2, &p2, &p1);
+			Vector3f_Sub(&v1, &pVrts[2].vertexPos, &pVrts[2].vertexPos);
+			Vector3f_Sub(&v2, &pVrts[1].vertexPos, &pVrts[0].vertexPos);
 			Vector3f_CP(&n, &v1, &v2);
 			l = 1.0;
 
@@ -267,9 +287,9 @@
 	}
 	for (i = 0; i < numVerts; i++) {
 		glColor4ub(pVrts[i].light.byte.r, pVrts[i].light.byte.g, pVrts[i].light.byte.b, pVrts[i].light.byte.a);
-		glTexCoord2f(pVrts[i].tu, pVrts[i].tv+texture_offset);
+		glTexCoord2f(pVrts[i].u, pVrts[i].v + texture_offset);
 		//d3dVrts[i].specular = pVrts[i].specular.argb;
-		glVertex3f(pVrts[i].sx, pVrts[i].sy, pVrts[i].sz);
+		glVertex3f(pVrts[i].vertexPos.x, pVrts[i].vertexPos.y, pVrts[i].vertexPos.z);
 	}
 	glEnd();
 	glDisable(GL_LIGHTING);
@@ -310,9 +330,9 @@
 static void pie_Draw3DShape2(iIMDShape *shape, int frame, PIELIGHT colour, PIELIGHT specular,
 		      int pieFlag, int pieFlagData)
 {
-	Sint32		tempY;
+	float		tempY;
 	int i, n;
-	Vector3i		*pVertices;
+	Vector3f	*pVertices;
 	Vector3f	*pPixels;
 	iIMDPoly	*pPolys;
 	PIEPOLY		piePoly;
@@ -400,11 +420,9 @@
 		}
 		for (n=0; n<pPolys->npnts; n++, index++)
 		{
-			pieVrts[n].sx = MAKEINT(scrPoints[*index].x);
-			pieVrts[n].sy = MAKEINT(scrPoints[*index].y);
-			pieVrts[n].sz = MAKEINT(scrPoints[*index].z);
-			pieVrts[n].tu = pPolys->vrt[n].u;
-			pieVrts[n].tv = pPolys->vrt[n].v;
+			pieVrts[n].vertexPos = scrPoints[*index];
+			pieVrts[n].u = pPolys->vrt[n].u;
+			pieVrts[n].v = pPolys->vrt[n].v;
 			pieVrts[n].light.argb = colour.argb;
 			pieVrts[n].specular.argb = specular.argb;
 		}
@@ -423,13 +441,13 @@
 }
 
 /// returns true if both vectors are equal
-static inline BOOL compare_point (Vector3i *A, Vector3i *B)
+static inline BOOL compare_point (Vector3f *A, Vector3f *B)
 {
 	return A->x == B->x && A->y == B->y && A->z == B->z;
 }
 
 /// returns true if the edges are adjacent
-static int compare_edge (EDGE *A, EDGE *B, Vector3i *pVertices )
+static int compare_edge (EDGE *A, EDGE *B, Vector3f *pVertices )
 {
 	if(A->from == B->to)
 	{
@@ -454,7 +472,7 @@
 
 /// Add an edge to an edgelist
 /// Makes sure only silhouette edges are present
-static void addToEdgeList(int a, int b, EDGE *edgelist, int *edge_count, Vector3i *pVertices)
+static void addToEdgeList(int a, int b, EDGE *edgelist, int *edge_count, Vector3f *pVertices)
 {
 	EDGE newEdge;
 	int i;
@@ -502,7 +520,7 @@
 static void pie_DrawShadow(iIMDShape *shape, int flag, int flag_data, Vector3f* light)
 {
 	int i,j, n;
-	Vector3i		*pVertices;
+	Vector3f	*pVertices;
 	iIMDPoly	*pPolys;
 	int edge_count = 0;
 	static EDGE *edgelist = NULL;
@@ -1021,8 +1039,8 @@
 
 				for (j=0; j<poly->nVrts; j++)
 				{
-					poly->pVrts[j].tu += uFrame;
-					poly->pVrts[j].tv += vFrame;
+					poly->pVrts[j].u += uFrame;
+					poly->pVrts[j].v += vFrame;
 				}
 			}
 		}
@@ -1062,8 +1080,8 @@
 	for ( i = 0; i < 3; i++ )
 	{
 		glColor4ub( aVrts[i].light.byte.r, aVrts[i].light.byte.g, aVrts[i].light.byte.b, aVrts[i].light.byte.a );
-		glTexCoord2f( aVrts[i].tu, aVrts[i].tv + offset );
-		glVertex3f( aVrts[i].sx, aVrts[i].sy, aVrts[i].sz );
+		glTexCoord2f( aVrts[i].u, aVrts[i].v + offset );
+		glVertex3f( aVrts[i].vertexPos.x, aVrts[i].vertexPos.y, aVrts[i].vertexPos.z );
 	}
 	glEnd();
 

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
Warzone-dev mailing list
Warzone-dev@gna.org
https://mail.gna.org/listinfo/warzone-dev

Reply via email to