diff -Naur source/Irrlicht.old/CTRFlat.cpp source/Irrlicht/CTRFlat.cpp --- source/Irrlicht.old/CTRFlat.cpp 2005-03-01 14:43:45.715474497 +0100 +++ source/Irrlicht/CTRFlat.cpp 2005-03-13 22:53:07.000000000 +0100 @@ -29,7 +29,7 @@ s16 color; f32 tmpDiv; // temporary division factor - f32 longest; // saves the longest span + bool longest; // saves the longest span s32 height; // saves height of triangle s16* targetSurface; // target pointer where to plot pixels s32 spanEnd; // saves end of spans @@ -59,54 +59,21 @@ ++indexList; // back face culling - - if (BackFaceCullingEnabled) - { - s32 z = ((v3->Pos.X - v1->Pos.X) * (v3->Pos.Y - v2->Pos.Y)) - - ((v3->Pos.Y - v1->Pos.Y) * (v3->Pos.X - v2->Pos.X)); - - if (z < 0) - continue; - } - - //near plane clipping - - if (v1->ZValue<0 && v2->ZValue<0 && v3->ZValue<0) + if (BackFaceCulling(v1,v2,v3)) continue; - // sort for width for inscreen clipping - - if (v1->Pos.X > v2->Pos.X) swapVertices(&v1, &v2); - if (v1->Pos.X > v3->Pos.X) swapVertices(&v1, &v3); - if (v2->Pos.X > v3->Pos.X) swapVertices(&v2, &v3); - - if ((v1->Pos.X - v3->Pos.X) == 0) + //near plane clipping + if (NearPlaneClipping(v1,v2,v3)) continue; - TriangleRect.UpperLeftCorner.X = v1->Pos.X; - TriangleRect.LowerRightCorner.X = v3->Pos.X; - - // sort for height for faster drawing. - - if (v1->Pos.Y > v2->Pos.Y) swapVertices(&v1, &v2); - if (v1->Pos.Y > v3->Pos.Y) swapVertices(&v1, &v3); - if (v2->Pos.Y > v3->Pos.Y) swapVertices(&v2, &v3); - - TriangleRect.UpperLeftCorner.Y = v1->Pos.Y; - TriangleRect.LowerRightCorner.Y = v3->Pos.Y; - - if (!TriangleRect.isRectCollided(ViewPortRect)) + // inscreen clipping + if (InScreenClipping(&v1,&v2,&v3)) continue; - - // höhe des dreiecks berechnen - height = v3->Pos.Y - v1->Pos.Y; - if (!height) - continue; + height = v3->Pos.Y-v1->Pos.Y; // calculate longest span - - longest = (v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X); + longest = ((v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X)) < 0.0f; spanEnd = v2->Pos.Y; span = v1->Pos.Y; @@ -121,7 +88,7 @@ targetSurface = lockedSurface + span * SurfaceWidth; zTarget = lockedZBuffer + span * SurfaceWidth; - if (longest < 0.0f) + if (longest) { tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); rightdeltaxf = (v2->Pos.X - v1->Pos.X) * tmpDiv; @@ -144,7 +111,7 @@ // do it twice, once for the first half of the triangle, - // end then for the second half. + // and then for the second half. for (s32 triangleHalf=0; triangleHalf<2; ++triangleHalf) { @@ -234,13 +201,13 @@ rightZValue += rightZStep; } - if (triangleHalf>0) // break, we've gout only two halves + if (triangleHalf>0) // break, we've got only two halves break; // setup variables for second half of the triangle. - if (longest < 0.0f) + if (longest) { tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); diff -Naur source/Irrlicht.old/CTRFlatWire.cpp source/Irrlicht/CTRFlatWire.cpp --- source/Irrlicht.old/CTRFlatWire.cpp 2005-03-01 14:43:45.721473648 +0100 +++ source/Irrlicht/CTRFlatWire.cpp 2005-03-13 22:53:04.000000000 +0100 @@ -29,7 +29,7 @@ s16 color; f32 tmpDiv; // temporary division factor - f32 longest; // saves the longest span + bool longest; // saves the longest span s32 height; // saves height of triangle s16* targetSurface; // target pointer where to plot pixels s32 spanEnd; // saves end of spans @@ -58,53 +58,21 @@ // back face culling - if (BackFaceCullingEnabled) - { - s32 z = ((v3->Pos.X - v1->Pos.X) * (v3->Pos.Y - v2->Pos.Y)) - - ((v3->Pos.Y - v1->Pos.Y) * (v3->Pos.X - v2->Pos.X)); - - if (z < 0) - continue; - } - - //near plane clipping - - if (v1->ZValue<0 && v2->ZValue<0 && v3->ZValue<0) + if (BackFaceCulling(v1,v2,v3)) continue; - // sort for width for inscreen clipping - - if (v1->Pos.X > v2->Pos.X) swapVertices(&v1, &v2); - if (v1->Pos.X > v3->Pos.X) swapVertices(&v1, &v3); - if (v2->Pos.X > v3->Pos.X) swapVertices(&v2, &v3); - - if ((v1->Pos.X - v3->Pos.X) == 0) + //near plane clipping + if (NearPlaneClipping(v1,v2,v3)) continue; - TriangleRect.UpperLeftCorner.X = v1->Pos.X; - TriangleRect.LowerRightCorner.X = v3->Pos.X; - - // sort for height for faster drawing. - - if (v1->Pos.Y > v2->Pos.Y) swapVertices(&v1, &v2); - if (v1->Pos.Y > v3->Pos.Y) swapVertices(&v1, &v3); - if (v2->Pos.Y > v3->Pos.Y) swapVertices(&v2, &v3); - - TriangleRect.UpperLeftCorner.Y = v1->Pos.Y; - TriangleRect.LowerRightCorner.Y = v3->Pos.Y; - - if (!TriangleRect.isRectCollided(ViewPortRect)) + // inscreen clipping + if (InScreenClipping(&v1,&v2,&v3)) continue; - - // höhe des dreiecks berechnen - height = v3->Pos.Y - v1->Pos.Y; - if (!height) - continue; + height = v3->Pos.Y-v1->Pos.Y; // calculate longest span - - longest = (v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X); + longest = ((v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X)) < 0.0f; spanEnd = v2->Pos.Y; span = v1->Pos.Y; @@ -119,7 +87,7 @@ targetSurface = lockedSurface + span * SurfaceWidth; zTarget = lockedZBuffer + span * SurfaceWidth; - if (longest < 0.0f) + if (longest) { tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); rightdeltaxf = (v2->Pos.X - v1->Pos.X) * tmpDiv; @@ -142,7 +110,7 @@ // do it twice, once for the first half of the triangle, - // end then for the second half. + // and then for the second half. for (s32 triangleHalf=0; triangleHalf<2; ++triangleHalf) { @@ -216,13 +184,13 @@ rightZValue += rightZStep; } - if (triangleHalf>0) // break, we've gout only two halves + if (triangleHalf>0) // break, we've got only two halves break; // setup variables for second half of the triangle. - if (longest < 0.0f) + if (longest) { tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); @@ -255,7 +223,7 @@ }; -//! creates a flat triangle renderer +//! creates a flat wire triangle renderer ITriangleRenderer* createTriangleRendererFlatWire(IZBuffer* zbuffer) { return new CTRFlatWire(zbuffer); diff -Naur source/Irrlicht.old/CTRGouraudWire.cpp source/Irrlicht/CTRGouraudWire.cpp --- source/Irrlicht.old/CTRGouraudWire.cpp 2005-03-01 14:43:45.734471807 +0100 +++ source/Irrlicht/CTRGouraudWire.cpp 2005-03-13 22:52:58.000000000 +0100 @@ -28,7 +28,7 @@ const S2DVertex *v1, *v2, *v3; f32 tmpDiv; // temporary division factor - f32 longest; // saves the longest span + bool longest; // saves the longest span s32 height; // saves height of triangle s16* targetSurface; // target pointer where to plot pixels s32 spanEnd; // saves end of spans @@ -61,53 +61,21 @@ // back face culling - if (BackFaceCullingEnabled) - { - s32 z = ((v3->Pos.X - v1->Pos.X) * (v3->Pos.Y - v2->Pos.Y)) - - ((v3->Pos.Y - v1->Pos.Y) * (v3->Pos.X - v2->Pos.X)); - - if (z < 0) - continue; - } - - //near plane clipping - - if (v1->ZValue<0 && v2->ZValue<0 && v3->ZValue<0) + if (BackFaceCulling(v1,v2,v3)) continue; - // sort for width for inscreen clipping - - if (v1->Pos.X > v2->Pos.X) swapVertices(&v1, &v2); - if (v1->Pos.X > v3->Pos.X) swapVertices(&v1, &v3); - if (v2->Pos.X > v3->Pos.X) swapVertices(&v2, &v3); - - if ((v1->Pos.X - v3->Pos.X) == 0) + //near plane clipping + if (NearPlaneClipping(v1,v2,v3)) continue; - TriangleRect.UpperLeftCorner.X = v1->Pos.X; - TriangleRect.LowerRightCorner.X = v3->Pos.X; - - // sort for height for faster drawing. - - if (v1->Pos.Y > v2->Pos.Y) swapVertices(&v1, &v2); - if (v1->Pos.Y > v3->Pos.Y) swapVertices(&v1, &v3); - if (v2->Pos.Y > v3->Pos.Y) swapVertices(&v2, &v3); - - TriangleRect.UpperLeftCorner.Y = v1->Pos.Y; - TriangleRect.LowerRightCorner.Y = v3->Pos.Y; - - if (!TriangleRect.isRectCollided(ViewPortRect)) + // inscreen clipping + if (InScreenClipping(&v1,&v2,&v3)) continue; - - // höhe des dreiecks berechnen - height = v3->Pos.Y - v1->Pos.Y; - if (!height) - continue; + height = v3->Pos.Y-v1->Pos.Y; // calculate longest span - - longest = (v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X); + longest = ((v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X)) < 0.0f; spanEnd = v2->Pos.Y; span = v1->Pos.Y; @@ -124,7 +92,7 @@ targetSurface = lockedSurface + span * SurfaceWidth; zTarget = lockedZBuffer + span * SurfaceWidth; - if (longest < 0.0f) + if (longest) { tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); rightdeltaxf = (v2->Pos.X - v1->Pos.X) * tmpDiv; @@ -159,7 +127,7 @@ // do it twice, once for the first half of the triangle, - // end then for the second half. + // and then for the second half. for (s32 triangleHalf=0; triangleHalf<2; ++triangleHalf) { @@ -245,13 +213,13 @@ rightB += rightStepB; } - if (triangleHalf>0) // break, we've gout only two halves + if (triangleHalf>0) // break, we've got only two halves break; // setup variables for second half of the triangle. - if (longest < 0.0f) + if (longest) { tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); @@ -299,7 +267,7 @@ }; -//! creates a flat triangle renderer +//! creates a gouraud wire triangle renderer ITriangleRenderer* createTriangleRendererGouraudWire(IZBuffer* zbuffer) { return new CTRGouraudWire(zbuffer); diff -Naur source/Irrlicht.old/CTRTextureFlat.cpp source/Irrlicht/CTRTextureFlat.cpp --- source/Irrlicht.old/CTRTextureFlat.cpp 2005-03-01 14:43:45.763467702 +0100 +++ source/Irrlicht/CTRTextureFlat.cpp 2005-03-13 22:52:52.000000000 +0100 @@ -28,7 +28,7 @@ const S2DVertex *v1, *v2, *v3; f32 tmpDiv; // temporary division factor - f32 longest; // saves the longest span + bool longest; // saves the longest span s32 height; // saves height of triangle s16* targetSurface; // target pointer where to plot pixels s32 spanEnd; // saves end of spans @@ -63,53 +63,21 @@ // back face culling - if (BackFaceCullingEnabled) - { - s32 z = ((v3->Pos.X - v1->Pos.X) * (v3->Pos.Y - v2->Pos.Y)) - - ((v3->Pos.Y - v1->Pos.Y) * (v3->Pos.X - v2->Pos.X)); - - if (z < 0) - continue; - } - - //near plane clipping - - if (v1->ZValue<0 && v2->ZValue<0 && v3->ZValue<0) + if (BackFaceCulling(v1,v2,v3)) continue; - // sort for width for inscreen clipping - - if (v1->Pos.X > v2->Pos.X) swapVertices(&v1, &v2); - if (v1->Pos.X > v3->Pos.X) swapVertices(&v1, &v3); - if (v2->Pos.X > v3->Pos.X) swapVertices(&v2, &v3); - - if ((v1->Pos.X - v3->Pos.X) == 0) + //near plane clipping + if (NearPlaneClipping(v1,v2,v3)) continue; - TriangleRect.UpperLeftCorner.X = v1->Pos.X; - TriangleRect.LowerRightCorner.X = v3->Pos.X; - - // sort for height for faster drawing. - - if (v1->Pos.Y > v2->Pos.Y) swapVertices(&v1, &v2); - if (v1->Pos.Y > v3->Pos.Y) swapVertices(&v1, &v3); - if (v2->Pos.Y > v3->Pos.Y) swapVertices(&v2, &v3); - - TriangleRect.UpperLeftCorner.Y = v1->Pos.Y; - TriangleRect.LowerRightCorner.Y = v3->Pos.Y; - - if (!TriangleRect.isRectCollided(ViewPortRect)) + // inscreen clipping + if (InScreenClipping(&v1,&v2,&v3)) continue; - - // höhe des dreiecks berechnen - height = v3->Pos.Y - v1->Pos.Y; - if (!height) - continue; + height = v3->Pos.Y-v1->Pos.Y; // calculate longest span - - longest = (v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X); + longest = ((v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X)) < 0.0f; spanEnd = v2->Pos.Y; span = v1->Pos.Y; @@ -125,7 +93,7 @@ targetSurface = lockedSurface + span * SurfaceWidth; zTarget = lockedZBuffer + span * SurfaceWidth; - if (longest < 0.0f) + if (longest) { tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); rightdeltaxf = (v2->Pos.X - v1->Pos.X) * tmpDiv; @@ -156,7 +124,7 @@ // do it twice, once for the first half of the triangle, - // end then for the second half. + // and then for the second half. for (s32 triangleHalf=0; triangleHalf<2; ++triangleHalf) { @@ -264,13 +232,13 @@ rightTy += rightTyStep; } - if (triangleHalf>0) // break, we've gout only two halves + if (triangleHalf>0) // break, we've got only two halves break; // setup variables for second half of the triangle. - if (longest < 0.0f) + if (longest) { tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); @@ -315,7 +283,7 @@ }; -//! creates a flat triangle renderer +//! creates a flat textured triangle renderer ITriangleRenderer* createTriangleRendererTextureFlat(IZBuffer* zbuffer) { return new CTRTextureFlat(zbuffer); diff -Naur source/Irrlicht.old/CTRTextureFlatWire.cpp source/Irrlicht/CTRTextureFlatWire.cpp --- source/Irrlicht.old/CTRTextureFlatWire.cpp 2005-03-01 14:43:45.770466711 +0100 +++ source/Irrlicht/CTRTextureFlatWire.cpp 2005-03-13 22:52:50.000000000 +0100 @@ -28,7 +28,7 @@ const S2DVertex *v1, *v2, *v3; f32 tmpDiv; // temporary division factor - f32 longest; // saves the longest span + bool longest; // saves the longest span s32 height; // saves height of triangle s16* targetSurface; // target pointer where to plot pixels s32 spanEnd; // saves end of spans @@ -60,53 +60,21 @@ // back face culling - if (BackFaceCullingEnabled) - { - s32 z = ((v3->Pos.X - v1->Pos.X) * (v3->Pos.Y - v2->Pos.Y)) - - ((v3->Pos.Y - v1->Pos.Y) * (v3->Pos.X - v2->Pos.X)); - - if (z < 0) - continue; - } - - //near plane clipping - - if (v1->ZValue<0 && v2->ZValue<0 && v3->ZValue<0) + if (BackFaceCulling(v1,v2,v3)) continue; - // sort for width for inscreen clipping - - if (v1->Pos.X > v2->Pos.X) swapVertices(&v1, &v2); - if (v1->Pos.X > v3->Pos.X) swapVertices(&v1, &v3); - if (v2->Pos.X > v3->Pos.X) swapVertices(&v2, &v3); - - if ((v1->Pos.X - v3->Pos.X) == 0) + //near plane clipping + if (NearPlaneClipping(v1,v2,v3)) continue; - TriangleRect.UpperLeftCorner.X = v1->Pos.X; - TriangleRect.LowerRightCorner.X = v3->Pos.X; - - // sort for height for faster drawing. - - if (v1->Pos.Y > v2->Pos.Y) swapVertices(&v1, &v2); - if (v1->Pos.Y > v3->Pos.Y) swapVertices(&v1, &v3); - if (v2->Pos.Y > v3->Pos.Y) swapVertices(&v2, &v3); - - TriangleRect.UpperLeftCorner.Y = v1->Pos.Y; - TriangleRect.LowerRightCorner.Y = v3->Pos.Y; - - if (!TriangleRect.isRectCollided(ViewPortRect)) + // inscreen clipping + if (InScreenClipping(&v1,&v2,&v3)) continue; - - // höhe des dreiecks berechnen - height = v3->Pos.Y - v1->Pos.Y; - if (!height) - continue; + height = v3->Pos.Y-v1->Pos.Y; // calculate longest span - - longest = (v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X); + longest = ((v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X)) < 0.0f; spanEnd = v2->Pos.Y; span = v1->Pos.Y; @@ -122,7 +90,7 @@ targetSurface = lockedSurface + span * SurfaceWidth; zTarget = lockedZBuffer + span * SurfaceWidth; - if (longest < 0.0f) + if (longest) { tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); rightdeltaxf = (v2->Pos.X - v1->Pos.X) * tmpDiv; @@ -153,7 +121,7 @@ // do it twice, once for the first half of the triangle, - // end then for the second half. + // and then for the second half. for (s32 triangleHalf=0; triangleHalf<2; ++triangleHalf) { @@ -236,13 +204,13 @@ rightTy += rightTyStep; } - if (triangleHalf>0) // break, we've gout only two halves + if (triangleHalf>0) // break, we've got only two halves break; // setup variables for second half of the triangle. - if (longest < 0.0f) + if (longest) { tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); @@ -287,7 +255,7 @@ }; -//! creates a flat triangle renderer +//! creates a flat wire textured triangle renderer ITriangleRenderer* createTriangleRendererTextureFlatWire(IZBuffer* zbuffer) { return new CTRTextureFlatWire(zbuffer); diff -Naur source/Irrlicht.old/CTRTextureGouraud.cpp source/Irrlicht/CTRTextureGouraud.cpp --- source/Irrlicht.old/CTRTextureGouraud.cpp 2005-04-04 11:01:38.845456326 +0200 +++ source/Irrlicht/CTRTextureGouraud.cpp 2005-03-14 10:35:49.949622707 +0100 @@ -94,17 +94,15 @@ { const S2DVertex *v1, *v2, *v3; - s16 color; - f32 tmpDiv; // temporary division factor - f32 longest; // saves the longest span + bool longest; // saves the longest span s32 height; // saves height of triangle s16* targetSurface; // target pointer where to plot pixels - s32 spanEnd; // saves end of spans f32 leftdeltaxf; // amount of pixels to increase on left side of triangle f32 rightdeltaxf; // amount of pixels to increase on right side of triangle s32 leftx, rightx; // position where we are f32 leftxf, rightxf; // same as above, but as f32 values s32 span; // current span + s32 spanEnd; // saves end of spans s16 *hSpanBegin, *hSpanEnd; // pointer used when plotting pixels s32 leftR, leftG, leftB, rightR, rightG, rightB; // color values s32 leftStepR, leftStepG, leftStepB, @@ -113,7 +111,6 @@ s32 leftTx, rightTx, leftTy, rightTy; // texture interpolating values s32 leftTxStep, rightTxStep, leftTyStep, rightTyStep; // texture interpolating values s32 spanTx, spanTy, spanTxStep, spanTyStep; // values of Texturecoords when drawing a span - core::rect TriangleRect; s32 leftZValue, rightZValue; s32 leftZStep, rightZStep; @@ -134,59 +131,25 @@ ++indexList; // back face culling - - if (BackFaceCullingEnabled) - { - s32 z = ((v3->Pos.X - v1->Pos.X) * (v3->Pos.Y - v2->Pos.Y)) - - ((v3->Pos.Y - v1->Pos.Y) * (v3->Pos.X - v2->Pos.X)); - - if (z < 0) - continue; - } - - //near plane clipping - - if (v1->ZValue<0 && v2->ZValue<0 && v3->ZValue<0) + if (BackFaceCulling(v1,v2,v3)) continue; - // sort for width for inscreen clipping - - if (v1->Pos.X > v2->Pos.X) swapVertices(&v1, &v2); - if (v1->Pos.X > v3->Pos.X) swapVertices(&v1, &v3); - if (v2->Pos.X > v3->Pos.X) swapVertices(&v2, &v3); - - if ((v1->Pos.X - v3->Pos.X) == 0) + //near plane clipping + if (NearPlaneClipping(v1,v2,v3)) continue; - TriangleRect.UpperLeftCorner.X = v1->Pos.X; - TriangleRect.LowerRightCorner.X = v3->Pos.X; - - // sort for height for faster drawing. - - if (v1->Pos.Y > v2->Pos.Y) swapVertices(&v1, &v2); - if (v1->Pos.Y > v3->Pos.Y) swapVertices(&v1, &v3); - if (v2->Pos.Y > v3->Pos.Y) swapVertices(&v2, &v3); - - TriangleRect.UpperLeftCorner.Y = v1->Pos.Y; - TriangleRect.LowerRightCorner.Y = v3->Pos.Y; - - if (!TriangleRect.isRectCollided(ViewPortRect)) + // in screen clipping + if (InScreenClipping(&v1,&v2,&v3)) continue; - - // höhe des dreiecks berechnen - height = v3->Pos.Y - v1->Pos.Y; - if (!height) - continue; + height = v3->Pos.Y-v1->Pos.Y; // calculate longest span + longest = ((v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X)) < 0.0f; - longest = (v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X); - - spanEnd = v2->Pos.Y; span = v1->Pos.Y; - leftxf = (f32)v1->Pos.X; - rightxf = (f32)v1->Pos.X; + spanEnd = v2->Pos.Y; + leftxf = rightxf = (f32)v1->Pos.X; leftZValue = v1->ZValue; rightZValue = v1->ZValue; @@ -200,9 +163,9 @@ targetSurface = lockedSurface + span * SurfaceWidth; zTarget = lockedZBuffer + span * SurfaceWidth; - if (longest < 0.0f) + if (longest) { - tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); + f32 tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); rightdeltaxf = (v2->Pos.X - v1->Pos.X) * tmpDiv; rightZStep = (s32)((v2->ZValue - v1->ZValue) * tmpDiv); rightStepR = (s32)(((video::getRed(v2->Color)<<8) - rightR) * tmpDiv); @@ -222,7 +185,7 @@ } else { - tmpDiv = 1.0f / (f32)height; + f32 tmpDiv = 1.0f / (f32)height; rightdeltaxf = (v3->Pos.X - v1->Pos.X) * tmpDiv; rightZStep = (s32)((v3->ZValue - v1->ZValue) * tmpDiv); rightStepR = (s32)(((video::getRed(v3->Color)<<8) - rightR) * tmpDiv); @@ -243,7 +206,7 @@ // do it twice, once for the first half of the triangle, - // end then for the second half. + // and then for the second half. for (s32 triangleHalf=0; triangleHalf<2; ++triangleHalf) { @@ -338,7 +301,7 @@ if (spanZValue > *spanZTarget) { *spanZTarget = spanZValue; - color = lockedTexture[((spanTy>>8)&textureYMask) * lockedTextureWidth + ((spanTx>>8)&textureXMask)]; + s16 color = lockedTexture[((spanTy>>8)&textureYMask) * lockedTextureWidth + ((spanTx>>8)&textureXMask)]; *hSpanBegin = video::RGB16(video::getRed(color) * (spanR>>8) >>2, video::getGreen(color) * (spanG>>8) >>2, video::getBlue(color) * (spanB>>8) >>2); } @@ -376,15 +339,12 @@ rightTy += rightTyStep; } - if (triangleHalf>0) // break, we've gout only two halves - break; - - // setup variables for second half of the triangle. - - if (longest < 0.0f) + if (triangleHalf == 0) { - tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); + if (longest) + { + f32 tmpDiv = 1.0f / (f32)(v3->Pos.Y - v2->Pos.Y); rightdeltaxf = (v3->Pos.X - v2->Pos.X) * tmpDiv; rightxf = (f32)v2->Pos.X; @@ -393,20 +353,20 @@ rightZStep = (s32)((v3->ZValue - v2->ZValue) * tmpDiv); rightR = video::getRed(v2->Color)<<8; - rightG = video::getGreen(v2->Color)<<8; - rightB = video::getBlue(v2->Color)<<8; rightStepR = (s32)(((video::getRed(v3->Color)<<8) - rightR) * tmpDiv); + rightG = video::getGreen(v2->Color)<<8; rightStepG = (s32)(((video::getGreen(v3->Color)<<8) - rightG) * tmpDiv); + rightB = video::getBlue(v2->Color)<<8; rightStepB = (s32)(((video::getBlue(v3->Color)<<8) - rightB) * tmpDiv); rightTx = v2->TCoords.X; - rightTy = v2->TCoords.Y; rightTxStep = (s32)((v3->TCoords.X - rightTx) * tmpDiv); + rightTy = v2->TCoords.Y; rightTyStep = (s32)((v3->TCoords.Y - rightTy) * tmpDiv); } else { - tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); + f32 tmpDiv = 1.0f / (f32)(v3->Pos.Y - v2->Pos.Y); leftdeltaxf = (v3->Pos.X - v2->Pos.X) * tmpDiv; leftxf = (f32)v2->Pos.X; @@ -415,20 +375,20 @@ leftZStep = (s32)((v3->ZValue - v2->ZValue) * tmpDiv); leftR = video::getRed(v2->Color)<<8; - leftG = video::getGreen(v2->Color)<<8; - leftB = video::getBlue(v2->Color)<<8; leftStepR = (s32)(((video::getRed(v3->Color)<<8) - leftR) * tmpDiv); + leftG = video::getGreen(v2->Color)<<8; leftStepG = (s32)(((video::getGreen(v3->Color)<<8) - leftG) * tmpDiv); + leftB = video::getBlue(v2->Color)<<8; leftStepB = (s32)(((video::getBlue(v3->Color)<<8) - leftB) * tmpDiv); leftTx = v2->TCoords.X; - leftTy = v2->TCoords.Y; leftTxStep = (s32)((v3->TCoords.X - leftTx) * tmpDiv); + leftTy = v2->TCoords.Y; leftTyStep = (s32)((v3->TCoords.Y - leftTy) * tmpDiv); } - spanEnd = v3->Pos.Y; + } } } @@ -440,19 +400,12 @@ - - - - -//! creates a flat triangle renderer +//! creates a gouraud textured triangle renderer ITriangleRenderer* createTriangleRendererTextureGouraud(IZBuffer* zbuffer) { return new CTRTextureGouraud(zbuffer); } - } // end namespace video } // end namespace irr - - diff -Naur source/Irrlicht.old/CTRTextureGouraud.h source/Irrlicht/CTRTextureGouraud.h --- source/Irrlicht.old/CTRTextureGouraud.h 2005-03-01 14:43:45.783464870 +0100 +++ source/Irrlicht/CTRTextureGouraud.h 2005-03-14 11:26:06.312805537 +0100 @@ -7,6 +7,7 @@ #include "ITriangleRenderer.h" #include "rect.h" +#include namespace irr { @@ -35,6 +36,67 @@ //! sets the Texture virtual void setTexture(video::IImage* texture); + //! applies BackFaceCulling + //! returns true if triangle is culled + virtual inline bool BackFaceCulling(const S2DVertex *v1, const S2DVertex *v2, const S2DVertex *v3) + { + if (BackFaceCullingEnabled) + return (((v3->Pos.X - v1->Pos.X) * (v3->Pos.Y - v2->Pos.Y)) - + ((v3->Pos.Y - v1->Pos.Y) * (v3->Pos.X - v2->Pos.X)) < 0); + else + return false; + } + + //! applies NearPlaneClipping + //! returns true if triangle is behind the viewer + virtual inline bool NearPlaneClipping(const S2DVertex *v1, const S2DVertex *v2, const S2DVertex *v3) + { + return ((v1->ZValue<0) && (v2->ZValue<0) && (v3->ZValue<0)); + } + + //! applies InScreenClipping + //! Vertices are sorted on ascending height (Y coordinate) + //! returns true if triangle is not inside ViewPort + inline bool InScreenClipping(const S2DVertex **v1, const S2DVertex **v2, const S2DVertex **v3) + { + core::rect TriangleRect; + + // sort for width + if ((*v1)->Pos.X > (*v2)->Pos.X) + swapVertices(v1, v2); + if ((*v1)->Pos.X > (*v3)->Pos.X) + swapVertices(v1, v3); + if ((*v2)->Pos.X > (*v3)->Pos.X) + swapVertices(v2, v3); + + TriangleRect.UpperLeftCorner.X = (*v1)->Pos.X; + TriangleRect.LowerRightCorner.X = (*v3)->Pos.X; + + if (!TriangleRect.getWidth()) + return true; + + // sort for height for faster drawing. + if ((*v1)->Pos.Y > (*v2)->Pos.Y) + swapVertices(v1, v2); + if ((*v1)->Pos.Y > (*v3)->Pos.Y) + swapVertices(v1, v3); + if ((*v2)->Pos.Y > (*v3)->Pos.Y) + swapVertices(v2, v3); + + TriangleRect.UpperLeftCorner.Y = (*v1)->Pos.Y; + TriangleRect.LowerRightCorner.Y = (*v3)->Pos.Y; + + // calculate height of triangle + if (!TriangleRect.getHeight()) + return true; + + if (!TriangleRect.isRectCollided(ViewPortRect)) + return true; + + return false; + } + + protected: //! vertauscht zwei vertizen diff -Naur source/Irrlicht.old/CTRTextureGouraudWire.cpp source/Irrlicht/CTRTextureGouraudWire.cpp --- source/Irrlicht.old/CTRTextureGouraudWire.cpp 2005-03-01 14:43:45.789464021 +0100 +++ source/Irrlicht/CTRTextureGouraudWire.cpp 2005-03-13 22:52:43.000000000 +0100 @@ -29,7 +29,7 @@ s16 color; f32 tmpDiv; // temporary division factor - f32 longest; // saves the longest span + bool longest; // saves the longest span s32 height; // saves height of triangle s16* targetSurface; // target pointer where to plot pixels s32 spanEnd; // saves end of spans @@ -64,53 +64,21 @@ // back face culling - if (BackFaceCullingEnabled) - { - s32 z = ((v3->Pos.X - v1->Pos.X) * (v3->Pos.Y - v2->Pos.Y)) - - ((v3->Pos.Y - v1->Pos.Y) * (v3->Pos.X - v2->Pos.X)); - - if (z < 0) - continue; - } - - //near plane clipping - - if (v1->ZValue<0 && v2->ZValue<0 && v3->ZValue<0) + if (BackFaceCulling(v1,v2,v3)) continue; - // sort for width for inscreen clipping - - if (v1->Pos.X > v2->Pos.X) swapVertices(&v1, &v2); - if (v1->Pos.X > v3->Pos.X) swapVertices(&v1, &v3); - if (v2->Pos.X > v3->Pos.X) swapVertices(&v2, &v3); - - if ((v1->Pos.X - v3->Pos.X) == 0) + //near plane clipping + if (NearPlaneClipping(v1,v2,v3)) continue; - TriangleRect.UpperLeftCorner.X = v1->Pos.X; - TriangleRect.LowerRightCorner.X = v3->Pos.X; - - // sort for height for faster drawing. - - if (v1->Pos.Y > v2->Pos.Y) swapVertices(&v1, &v2); - if (v1->Pos.Y > v3->Pos.Y) swapVertices(&v1, &v3); - if (v2->Pos.Y > v3->Pos.Y) swapVertices(&v2, &v3); - - TriangleRect.UpperLeftCorner.Y = v1->Pos.Y; - TriangleRect.LowerRightCorner.Y = v3->Pos.Y; - - if (!TriangleRect.isRectCollided(ViewPortRect)) + // inscreen clipping + if (InScreenClipping(&v1,&v2,&v3)) continue; - - // höhe des dreiecks berechnen - height = v3->Pos.Y - v1->Pos.Y; - if (!height) - continue; + height = v3->Pos.Y-v1->Pos.Y; // calculate longest span - - longest = (v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X); + longest = ((v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X)) < 0.0f; spanEnd = v2->Pos.Y; span = v1->Pos.Y; @@ -129,7 +97,7 @@ targetSurface = lockedSurface + span * SurfaceWidth; zTarget = lockedZBuffer + span * SurfaceWidth; - if (longest < 0.0f) + if (longest) { tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); rightdeltaxf = (v2->Pos.X - v1->Pos.X) * tmpDiv; @@ -172,7 +140,7 @@ // do it twice, once for the first half of the triangle, - // end then for the second half. + // and then for the second half. for (s32 triangleHalf=0; triangleHalf<2; ++triangleHalf) { @@ -270,13 +238,13 @@ rightTy += rightTyStep; } - if (triangleHalf>0) // break, we've gout only two halves + if (triangleHalf>0) // break, we've got only two halves break; // setup variables for second half of the triangle. - if (longest < 0.0f) + if (longest) { tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); @@ -336,7 +304,7 @@ }; -//! creates a flat triangle renderer +//! creates a gouraud wire textured triangle renderer ITriangleRenderer* createTriangleRendererTextureGouraudWire(IZBuffer* zbuffer) { return new CTRTextureGouraudWire(zbuffer); diff -Naur source/Irrlicht.old/CTRTextureGouraudNoZ.cpp source/Irrlicht/CTRTextureGouraudNoZ.cpp --- source/Irrlicht.old/CTRTextureGouraudNoZ.cpp 2005-03-28 10:28:44.000000000 +0200 +++ source/Irrlicht/CTRTextureGouraudNoZ.cpp 2005-04-04 17:38:44.063785833 +0200 @@ -27,17 +27,15 @@ { const S2DVertex *v1, *v2, *v3; - s16 color; - f32 tmpDiv; // temporary division factor - f32 longest; // saves the longest span + bool longest; // saves the longest span s32 height; // saves height of triangle s16* targetSurface; // target pointer where to plot pixels - s32 spanEnd; // saves end of spans f32 leftdeltaxf; // amount of pixels to increase on left side of triangle f32 rightdeltaxf; // amount of pixels to increase on right side of triangle s32 leftx, rightx; // position where we are f32 leftxf, rightxf; // same as above, but as f32 values s32 span; // current span + s32 spanEnd; // saves end of spans s16 *hSpanBegin, *hSpanEnd; // pointer used when plotting pixels s32 leftR, leftG, leftB, rightR, rightG, rightB; // color values s32 leftStepR, leftStepG, leftStepB, @@ -61,59 +59,25 @@ ++indexList; // back face culling - - if (BackFaceCullingEnabled) - { - s32 z = ((v3->Pos.X - v1->Pos.X) * (v3->Pos.Y - v2->Pos.Y)) - - ((v3->Pos.Y - v1->Pos.Y) * (v3->Pos.X - v2->Pos.X)); - - if (z < 0) - continue; - } - - //near plane clipping - - if (v1->ZValue<0 && v2->ZValue<0 && v3->ZValue<0) + if (BackFaceCulling(v1,v2,v3)) continue; - // sort for width for inscreen clipping - - if (v1->Pos.X > v2->Pos.X) swapVertices(&v1, &v2); - if (v1->Pos.X > v3->Pos.X) swapVertices(&v1, &v3); - if (v2->Pos.X > v3->Pos.X) swapVertices(&v2, &v3); - - if ((v1->Pos.X - v3->Pos.X) == 0) + // near plane clipping + if (NearPlaneClipping(v1,v2,v3)) continue; - TriangleRect.UpperLeftCorner.X = v1->Pos.X; - TriangleRect.LowerRightCorner.X = v3->Pos.X; - - // sort for height for faster drawing. - - if (v1->Pos.Y > v2->Pos.Y) swapVertices(&v1, &v2); - if (v1->Pos.Y > v3->Pos.Y) swapVertices(&v1, &v3); - if (v2->Pos.Y > v3->Pos.Y) swapVertices(&v2, &v3); - - TriangleRect.UpperLeftCorner.Y = v1->Pos.Y; - TriangleRect.LowerRightCorner.Y = v3->Pos.Y; - - if (!TriangleRect.isRectCollided(ViewPortRect)) + // in screen clipping + if (InScreenClipping(&v1,&v2,&v3)) continue; - - // höhe des dreiecks berechnen height = v3->Pos.Y - v1->Pos.Y; - if (!height) - continue; // calculate longest span - - longest = (v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X); + longest = ((v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X)) < 0.0f; spanEnd = v2->Pos.Y; span = v1->Pos.Y; - leftxf = (f32)v1->Pos.X; - rightxf = (f32)v1->Pos.X; + leftxf = rightxf = (f32)v1->Pos.X; leftR = rightR = video::getRed(v1->Color)<<8; leftG = rightG = video::getGreen(v1->Color)<<8; @@ -125,7 +89,7 @@ if (longest < 0.0f) { - tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); + f32 tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); rightdeltaxf = (v2->Pos.X - v1->Pos.X) * tmpDiv; rightStepR = (s32)(((video::getRed(v2->Color)<<8) - rightR) * tmpDiv); rightStepG = (s32)(((video::getGreen(v2->Color)<<8) - rightG) * tmpDiv); @@ -143,7 +107,7 @@ } else { - tmpDiv = 1.0f / (f32)height; + f32 tmpDiv = 1.0f / (f32)height; rightdeltaxf = (v3->Pos.X - v1->Pos.X) * tmpDiv; rightStepR = (s32)(((video::getRed(v3->Color)<<8) - rightR) * tmpDiv); rightStepG = (s32)(((video::getGreen(v3->Color)<<8) - rightG) * tmpDiv); @@ -248,7 +212,7 @@ while (hSpanBegin < hSpanEnd) { - color = lockedTexture[((spanTy>>8)&textureYMask) * lockedTextureWidth + ((spanTx>>8)&textureXMask)]; + s16 color = lockedTexture[((spanTy>>8)&textureYMask) * lockedTextureWidth + ((spanTx>>8)&textureXMask)]; *hSpanBegin = video::RGB16(video::getRed(color) * (spanR>>8) >>2, video::getGreen(color) * (spanG>>8) >>2, video::getBlue(color) * (spanB>>8) >>2); spanR += spanStepR; @@ -280,53 +244,49 @@ rightTy += rightTyStep; } - if (triangleHalf>0) // break, we've gout only two halves - break; - - - // setup variables for second half of the triangle. - - if (longest < 0.0f) + if (triangleHalf == 0) // break, we've got only two halves + { + if (longest) { - tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); + f32 tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); rightdeltaxf = (v3->Pos.X - v2->Pos.X) * tmpDiv; rightxf = (f32)v2->Pos.X; rightR = video::getRed(v2->Color)<<8; - rightG = video::getGreen(v2->Color)<<8; - rightB = video::getBlue(v2->Color)<<8; rightStepR = (s32)(((video::getRed(v3->Color)<<8) - rightR) * tmpDiv); + rightG = video::getGreen(v2->Color)<<8; rightStepG = (s32)(((video::getGreen(v3->Color)<<8) - rightG) * tmpDiv); + rightB = video::getBlue(v2->Color)<<8; rightStepB = (s32)(((video::getBlue(v3->Color)<<8) - rightB) * tmpDiv); rightTx = v2->TCoords.X; - rightTy = v2->TCoords.Y; rightTxStep = (s32)((v3->TCoords.X - rightTx) * tmpDiv); + rightTy = v2->TCoords.Y; rightTyStep = (s32)((v3->TCoords.Y - rightTy) * tmpDiv); } else { - tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); + f32 tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); leftdeltaxf = (v3->Pos.X - v2->Pos.X) * tmpDiv; leftxf = (f32)v2->Pos.X; leftR = video::getRed(v2->Color)<<8; - leftG = video::getGreen(v2->Color)<<8; - leftB = video::getBlue(v2->Color)<<8; leftStepR = (s32)(((video::getRed(v3->Color)<<8) - leftR) * tmpDiv); + leftG = video::getGreen(v2->Color)<<8; leftStepG = (s32)(((video::getGreen(v3->Color)<<8) - leftG) * tmpDiv); + leftB = video::getBlue(v2->Color)<<8; leftStepB = (s32)(((video::getBlue(v3->Color)<<8) - leftB) * tmpDiv); leftTx = v2->TCoords.X; - leftTy = v2->TCoords.Y; leftTxStep = (s32)((v3->TCoords.X - leftTx) * tmpDiv); + leftTy = v2->TCoords.Y; leftTyStep = (s32)((v3->TCoords.Y - leftTy) * tmpDiv); } - spanEnd = v3->Pos.Y; + } } } @@ -338,7 +298,7 @@ }; -//! creates a flat triangle renderer +//! creates a gouraud textured triangle renderer without Z buffer ITriangleRenderer* createTriangleRendererTextureGouraudNoZ() { return new CTRTextureGouraudNoZ(); diff -Naur source/Irrlicht.old/CTRGouraud.cpp source/Irrlicht/CTRGouraud.cpp --- source/Irrlicht.old/CTRGouraud.cpp 2005-03-28 10:28:44.000000000 +0200 +++ source/Irrlicht/CTRGouraud.cpp 2005-04-05 15:04:58.268162873 +0200 @@ -28,7 +28,7 @@ const S2DVertex *v1, *v2, *v3; f32 tmpDiv; // temporary division factor - f32 longest; // saves the longest span + bool longest; // saves the longest span s32 height; // saves height of triangle s16* targetSurface; // target pointer where to plot pixels s32 spanEnd; // saves end of spans @@ -64,53 +64,21 @@ // back face culling - if (BackFaceCullingEnabled) - { - s32 z = ((v3->Pos.X - v1->Pos.X) * (v3->Pos.Y - v2->Pos.Y)) - - ((v3->Pos.Y - v1->Pos.Y) * (v3->Pos.X - v2->Pos.X)); - - if (z < 0) - continue; - } - - //near plane clipping - - if (v1->ZValue<0 && v2->ZValue<0 && v3->ZValue<0) + if (BackFaceCulling(v1,v2,v3)) continue; - // sort for width for inscreen clipping - - if (v1->Pos.X > v2->Pos.X) swapVertices(&v1, &v2); - if (v1->Pos.X > v3->Pos.X) swapVertices(&v1, &v3); - if (v2->Pos.X > v3->Pos.X) swapVertices(&v2, &v3); - - if ((v1->Pos.X - v3->Pos.X) == 0) + //near plane clipping + if (NearPlaneClipping(v1,v2,v3)) continue; - TriangleRect.UpperLeftCorner.X = v1->Pos.X; - TriangleRect.LowerRightCorner.X = v3->Pos.X; - - // sort for height for faster drawing. - - if (v1->Pos.Y > v2->Pos.Y) swapVertices(&v1, &v2); - if (v1->Pos.Y > v3->Pos.Y) swapVertices(&v1, &v3); - if (v2->Pos.Y > v3->Pos.Y) swapVertices(&v2, &v3); - - TriangleRect.UpperLeftCorner.Y = v1->Pos.Y; - TriangleRect.LowerRightCorner.Y = v3->Pos.Y; - - if (!TriangleRect.isRectCollided(ViewPortRect)) + // inscreen clipping + if (InScreenClipping(&v1,&v2,&v3)) continue; - - // höhe des dreiecks berechnen - height = v3->Pos.Y - v1->Pos.Y; - if (!height) - continue; + height = v3->Pos.Y-v1->Pos.Y; // calculate longest span - - longest = (v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X); + longest = ((v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X)) < 0.0f; spanEnd = v2->Pos.Y; span = v1->Pos.Y; @@ -127,7 +95,7 @@ targetSurface = lockedSurface + span * SurfaceWidth; zTarget = lockedZBuffer + span * SurfaceWidth; - if (longest < 0.0f) + if (longest) { tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); rightdeltaxf = (v2->Pos.X - v1->Pos.X) * tmpDiv; @@ -162,7 +130,7 @@ // do it twice, once for the first half of the triangle, - // end then for the second half. + // and then for the second half. for (s32 triangleHalf=0; triangleHalf<2; ++triangleHalf) { @@ -277,13 +245,13 @@ rightB += rightStepB; } - if (triangleHalf>0) // break, we've gout only two halves + if (triangleHalf>0) // break, we've got only two halves break; // setup variables for second half of the triangle. - if (longest < 0.0f) + if (longest) { tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); @@ -331,7 +299,7 @@ }; -//! creates a flat triangle renderer +//! creates a gouraud triangle renderer ITriangleRenderer* createTriangleRendererGouraud(IZBuffer* zbuffer) { return new CTRGouraud(zbuffer);