diff options
author | David Walter Seikel | 2013-01-13 18:54:10 +1000 |
---|---|---|
committer | David Walter Seikel | 2013-01-13 18:54:10 +1000 |
commit | 959831f4ef5a3e797f576c3de08cd65032c997ad (patch) | |
tree | e7351908be5995f0b325b2ebeaa02d5a34b82583 /libraries/irrlicht-1.8/source/Irrlicht/CTRFlatWire.cpp | |
parent | Add info about changes to Irrlicht. (diff) | |
download | SledjHamr-959831f4ef5a3e797f576c3de08cd65032c997ad.zip SledjHamr-959831f4ef5a3e797f576c3de08cd65032c997ad.tar.gz SledjHamr-959831f4ef5a3e797f576c3de08cd65032c997ad.tar.bz2 SledjHamr-959831f4ef5a3e797f576c3de08cd65032c997ad.tar.xz |
Remove damned ancient DOS line endings from Irrlicht. Hopefully I did not go overboard.
Diffstat (limited to '')
-rw-r--r-- | libraries/irrlicht-1.8/source/Irrlicht/CTRFlatWire.cpp | 562 |
1 files changed, 281 insertions, 281 deletions
diff --git a/libraries/irrlicht-1.8/source/Irrlicht/CTRFlatWire.cpp b/libraries/irrlicht-1.8/source/Irrlicht/CTRFlatWire.cpp index 4f0c5c7..193e654 100644 --- a/libraries/irrlicht-1.8/source/Irrlicht/CTRFlatWire.cpp +++ b/libraries/irrlicht-1.8/source/Irrlicht/CTRFlatWire.cpp | |||
@@ -1,281 +1,281 @@ | |||
1 | // Copyright (C) 2002-2012 Nikolaus Gebhardt | 1 | // Copyright (C) 2002-2012 Nikolaus Gebhardt |
2 | // This file is part of the "Irrlicht Engine". | 2 | // This file is part of the "Irrlicht Engine". |
3 | // For conditions of distribution and use, see copyright notice in irrlicht.h | 3 | // For conditions of distribution and use, see copyright notice in irrlicht.h |
4 | 4 | ||
5 | #include "IrrCompileConfig.h" | 5 | #include "IrrCompileConfig.h" |
6 | #include "CTRTextureGouraud.h" | 6 | #include "CTRTextureGouraud.h" |
7 | 7 | ||
8 | #ifdef _IRR_COMPILE_WITH_SOFTWARE_ | 8 | #ifdef _IRR_COMPILE_WITH_SOFTWARE_ |
9 | 9 | ||
10 | namespace irr | 10 | namespace irr |
11 | { | 11 | { |
12 | namespace video | 12 | namespace video |
13 | { | 13 | { |
14 | 14 | ||
15 | class CTRFlatWire : public CTRTextureGouraud | 15 | class CTRFlatWire : public CTRTextureGouraud |
16 | { | 16 | { |
17 | public: | 17 | public: |
18 | 18 | ||
19 | CTRFlatWire(IZBuffer* zbuffer) | 19 | CTRFlatWire(IZBuffer* zbuffer) |
20 | : CTRTextureGouraud(zbuffer) | 20 | : CTRTextureGouraud(zbuffer) |
21 | { | 21 | { |
22 | #ifdef _DEBUG | 22 | #ifdef _DEBUG |
23 | setDebugName("CTRWire"); | 23 | setDebugName("CTRWire"); |
24 | #endif | 24 | #endif |
25 | } | 25 | } |
26 | 26 | ||
27 | //! draws an indexed triangle list | 27 | //! draws an indexed triangle list |
28 | virtual void drawIndexedTriangleList(S2DVertex* vertices, s32 vertexCount, const u16* indexList, s32 triangleCount) | 28 | virtual void drawIndexedTriangleList(S2DVertex* vertices, s32 vertexCount, const u16* indexList, s32 triangleCount) |
29 | { | 29 | { |
30 | const S2DVertex *v1, *v2, *v3; | 30 | const S2DVertex *v1, *v2, *v3; |
31 | 31 | ||
32 | u16 color; | 32 | u16 color; |
33 | f32 tmpDiv; // temporary division factor | 33 | f32 tmpDiv; // temporary division factor |
34 | f32 longest; // saves the longest span | 34 | f32 longest; // saves the longest span |
35 | s32 height; // saves height of triangle | 35 | s32 height; // saves height of triangle |
36 | u16* targetSurface; // target pointer where to plot pixels | 36 | u16* targetSurface; // target pointer where to plot pixels |
37 | s32 spanEnd; // saves end of spans | 37 | s32 spanEnd; // saves end of spans |
38 | f32 leftdeltaxf; // amount of pixels to increase on left side of triangle | 38 | f32 leftdeltaxf; // amount of pixels to increase on left side of triangle |
39 | f32 rightdeltaxf; // amount of pixels to increase on right side of triangle | 39 | f32 rightdeltaxf; // amount of pixels to increase on right side of triangle |
40 | s32 leftx, rightx; // position where we are | 40 | s32 leftx, rightx; // position where we are |
41 | f32 leftxf, rightxf; // same as above, but as f32 values | 41 | f32 leftxf, rightxf; // same as above, but as f32 values |
42 | s32 span; // current span | 42 | s32 span; // current span |
43 | core::rect<s32> TriangleRect; | 43 | core::rect<s32> TriangleRect; |
44 | 44 | ||
45 | s32 leftZValue, rightZValue; | 45 | s32 leftZValue, rightZValue; |
46 | s32 leftZStep, rightZStep; | 46 | s32 leftZStep, rightZStep; |
47 | TZBufferType* zTarget; // target of ZBuffer; | 47 | TZBufferType* zTarget; // target of ZBuffer; |
48 | 48 | ||
49 | lockedSurface = (u16*)RenderTarget->lock(); | 49 | lockedSurface = (u16*)RenderTarget->lock(); |
50 | lockedZBuffer = ZBuffer->lock(); | 50 | lockedZBuffer = ZBuffer->lock(); |
51 | 51 | ||
52 | for (s32 i=0; i<triangleCount; ++i) | 52 | for (s32 i=0; i<triangleCount; ++i) |
53 | { | 53 | { |
54 | v1 = &vertices[*indexList]; | 54 | v1 = &vertices[*indexList]; |
55 | ++indexList; | 55 | ++indexList; |
56 | v2 = &vertices[*indexList]; | 56 | v2 = &vertices[*indexList]; |
57 | ++indexList; | 57 | ++indexList; |
58 | v3 = &vertices[*indexList]; | 58 | v3 = &vertices[*indexList]; |
59 | ++indexList; | 59 | ++indexList; |
60 | 60 | ||
61 | // back face culling | 61 | // back face culling |
62 | 62 | ||
63 | if (BackFaceCullingEnabled) | 63 | if (BackFaceCullingEnabled) |
64 | { | 64 | { |
65 | s32 z = ((v3->Pos.X - v1->Pos.X) * (v3->Pos.Y - v2->Pos.Y)) - | 65 | s32 z = ((v3->Pos.X - v1->Pos.X) * (v3->Pos.Y - v2->Pos.Y)) - |
66 | ((v3->Pos.Y - v1->Pos.Y) * (v3->Pos.X - v2->Pos.X)); | 66 | ((v3->Pos.Y - v1->Pos.Y) * (v3->Pos.X - v2->Pos.X)); |
67 | 67 | ||
68 | if (z < 0) | 68 | if (z < 0) |
69 | continue; | 69 | continue; |
70 | } | 70 | } |
71 | 71 | ||
72 | //near plane clipping | 72 | //near plane clipping |
73 | 73 | ||
74 | if (v1->ZValue<0 && v2->ZValue<0 && v3->ZValue<0) | 74 | if (v1->ZValue<0 && v2->ZValue<0 && v3->ZValue<0) |
75 | continue; | 75 | continue; |
76 | 76 | ||
77 | // sort for width for inscreen clipping | 77 | // sort for width for inscreen clipping |
78 | 78 | ||
79 | if (v1->Pos.X > v2->Pos.X) swapVertices(&v1, &v2); | 79 | if (v1->Pos.X > v2->Pos.X) swapVertices(&v1, &v2); |
80 | if (v1->Pos.X > v3->Pos.X) swapVertices(&v1, &v3); | 80 | if (v1->Pos.X > v3->Pos.X) swapVertices(&v1, &v3); |
81 | if (v2->Pos.X > v3->Pos.X) swapVertices(&v2, &v3); | 81 | if (v2->Pos.X > v3->Pos.X) swapVertices(&v2, &v3); |
82 | 82 | ||
83 | if ((v1->Pos.X - v3->Pos.X) == 0) | 83 | if ((v1->Pos.X - v3->Pos.X) == 0) |
84 | continue; | 84 | continue; |
85 | 85 | ||
86 | TriangleRect.UpperLeftCorner.X = v1->Pos.X; | 86 | TriangleRect.UpperLeftCorner.X = v1->Pos.X; |
87 | TriangleRect.LowerRightCorner.X = v3->Pos.X; | 87 | TriangleRect.LowerRightCorner.X = v3->Pos.X; |
88 | 88 | ||
89 | // sort for height for faster drawing. | 89 | // sort for height for faster drawing. |
90 | 90 | ||
91 | if (v1->Pos.Y > v2->Pos.Y) swapVertices(&v1, &v2); | 91 | if (v1->Pos.Y > v2->Pos.Y) swapVertices(&v1, &v2); |
92 | if (v1->Pos.Y > v3->Pos.Y) swapVertices(&v1, &v3); | 92 | if (v1->Pos.Y > v3->Pos.Y) swapVertices(&v1, &v3); |
93 | if (v2->Pos.Y > v3->Pos.Y) swapVertices(&v2, &v3); | 93 | if (v2->Pos.Y > v3->Pos.Y) swapVertices(&v2, &v3); |
94 | 94 | ||
95 | TriangleRect.UpperLeftCorner.Y = v1->Pos.Y; | 95 | TriangleRect.UpperLeftCorner.Y = v1->Pos.Y; |
96 | TriangleRect.LowerRightCorner.Y = v3->Pos.Y; | 96 | TriangleRect.LowerRightCorner.Y = v3->Pos.Y; |
97 | 97 | ||
98 | if (!TriangleRect.isRectCollided(ViewPortRect)) | 98 | if (!TriangleRect.isRectCollided(ViewPortRect)) |
99 | continue; | 99 | continue; |
100 | 100 | ||
101 | // calculate height of triangle | 101 | // calculate height of triangle |
102 | height = v3->Pos.Y - v1->Pos.Y; | 102 | height = v3->Pos.Y - v1->Pos.Y; |
103 | if (!height) | 103 | if (!height) |
104 | continue; | 104 | continue; |
105 | 105 | ||
106 | // calculate longest span | 106 | // calculate longest span |
107 | 107 | ||
108 | longest = (v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X); | 108 | longest = (v2->Pos.Y - v1->Pos.Y) / (f32)height * (v3->Pos.X - v1->Pos.X) + (v1->Pos.X - v2->Pos.X); |
109 | 109 | ||
110 | spanEnd = v2->Pos.Y; | 110 | spanEnd = v2->Pos.Y; |
111 | span = v1->Pos.Y; | 111 | span = v1->Pos.Y; |
112 | leftxf = (f32)v1->Pos.X; | 112 | leftxf = (f32)v1->Pos.X; |
113 | rightxf = (f32)v1->Pos.X; | 113 | rightxf = (f32)v1->Pos.X; |
114 | 114 | ||
115 | leftZValue = v1->ZValue; | 115 | leftZValue = v1->ZValue; |
116 | rightZValue = v1->ZValue; | 116 | rightZValue = v1->ZValue; |
117 | 117 | ||
118 | color = v1->Color; | 118 | color = v1->Color; |
119 | 119 | ||
120 | targetSurface = lockedSurface + span * SurfaceWidth; | 120 | targetSurface = lockedSurface + span * SurfaceWidth; |
121 | zTarget = lockedZBuffer + span * SurfaceWidth; | 121 | zTarget = lockedZBuffer + span * SurfaceWidth; |
122 | 122 | ||
123 | if (longest < 0.0f) | 123 | if (longest < 0.0f) |
124 | { | 124 | { |
125 | tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); | 125 | tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); |
126 | rightdeltaxf = (v2->Pos.X - v1->Pos.X) * tmpDiv; | 126 | rightdeltaxf = (v2->Pos.X - v1->Pos.X) * tmpDiv; |
127 | rightZStep = (s32)((v2->ZValue - v1->ZValue) * tmpDiv); | 127 | rightZStep = (s32)((v2->ZValue - v1->ZValue) * tmpDiv); |
128 | 128 | ||
129 | tmpDiv = 1.0f / (f32)height; | 129 | tmpDiv = 1.0f / (f32)height; |
130 | leftdeltaxf = (v3->Pos.X - v1->Pos.X) * tmpDiv; | 130 | leftdeltaxf = (v3->Pos.X - v1->Pos.X) * tmpDiv; |
131 | leftZStep = (s32)((v3->ZValue - v1->ZValue) * tmpDiv); | 131 | leftZStep = (s32)((v3->ZValue - v1->ZValue) * tmpDiv); |
132 | } | 132 | } |
133 | else | 133 | else |
134 | { | 134 | { |
135 | tmpDiv = 1.0f / (f32)height; | 135 | tmpDiv = 1.0f / (f32)height; |
136 | rightdeltaxf = (v3->Pos.X - v1->Pos.X) * tmpDiv; | 136 | rightdeltaxf = (v3->Pos.X - v1->Pos.X) * tmpDiv; |
137 | rightZStep = (s32)((v3->ZValue - v1->ZValue) * tmpDiv); | 137 | rightZStep = (s32)((v3->ZValue - v1->ZValue) * tmpDiv); |
138 | 138 | ||
139 | tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); | 139 | tmpDiv = 1.0f / (f32)(v2->Pos.Y - v1->Pos.Y); |
140 | leftdeltaxf = (v2->Pos.X - v1->Pos.X) * tmpDiv; | 140 | leftdeltaxf = (v2->Pos.X - v1->Pos.X) * tmpDiv; |
141 | leftZStep = (s32)((v2->ZValue - v1->ZValue) * tmpDiv); | 141 | leftZStep = (s32)((v2->ZValue - v1->ZValue) * tmpDiv); |
142 | } | 142 | } |
143 | 143 | ||
144 | 144 | ||
145 | // do it twice, once for the first half of the triangle, | 145 | // do it twice, once for the first half of the triangle, |
146 | // end then for the second half. | 146 | // end then for the second half. |
147 | 147 | ||
148 | for (s32 triangleHalf=0; triangleHalf<2; ++triangleHalf) | 148 | for (s32 triangleHalf=0; triangleHalf<2; ++triangleHalf) |
149 | { | 149 | { |
150 | if (spanEnd > ViewPortRect.LowerRightCorner.Y) | 150 | if (spanEnd > ViewPortRect.LowerRightCorner.Y) |
151 | spanEnd = ViewPortRect.LowerRightCorner.Y; | 151 | spanEnd = ViewPortRect.LowerRightCorner.Y; |
152 | 152 | ||
153 | // if the span <0, than we can skip these spans, | 153 | // if the span <0, than we can skip these spans, |
154 | // and proceed to the next spans which are really on the screen. | 154 | // and proceed to the next spans which are really on the screen. |
155 | if (span < ViewPortRect.UpperLeftCorner.Y) | 155 | if (span < ViewPortRect.UpperLeftCorner.Y) |
156 | { | 156 | { |
157 | // we'll use leftx as temp variable | 157 | // we'll use leftx as temp variable |
158 | if (spanEnd < ViewPortRect.UpperLeftCorner.Y) | 158 | if (spanEnd < ViewPortRect.UpperLeftCorner.Y) |
159 | { | 159 | { |
160 | leftx = spanEnd - span; | 160 | leftx = spanEnd - span; |
161 | span = spanEnd; | 161 | span = spanEnd; |
162 | } | 162 | } |
163 | else | 163 | else |
164 | { | 164 | { |
165 | leftx = ViewPortRect.UpperLeftCorner.Y - span; | 165 | leftx = ViewPortRect.UpperLeftCorner.Y - span; |
166 | span = ViewPortRect.UpperLeftCorner.Y; | 166 | span = ViewPortRect.UpperLeftCorner.Y; |
167 | } | 167 | } |
168 | 168 | ||
169 | leftxf += leftdeltaxf*leftx; | 169 | leftxf += leftdeltaxf*leftx; |
170 | rightxf += rightdeltaxf*leftx; | 170 | rightxf += rightdeltaxf*leftx; |
171 | targetSurface += SurfaceWidth*leftx; | 171 | targetSurface += SurfaceWidth*leftx; |
172 | zTarget += SurfaceWidth*leftx; | 172 | zTarget += SurfaceWidth*leftx; |
173 | leftZValue += leftZStep*leftx; | 173 | leftZValue += leftZStep*leftx; |
174 | rightZValue += rightZStep*leftx; | 174 | rightZValue += rightZStep*leftx; |
175 | } | 175 | } |
176 | 176 | ||
177 | 177 | ||
178 | // the main loop. Go through every span and draw it. | 178 | // the main loop. Go through every span and draw it. |
179 | 179 | ||
180 | while (span < spanEnd) | 180 | while (span < spanEnd) |
181 | { | 181 | { |
182 | leftx = (s32)(leftxf); | 182 | leftx = (s32)(leftxf); |
183 | rightx = (s32)(rightxf + 0.5f); | 183 | rightx = (s32)(rightxf + 0.5f); |
184 | 184 | ||
185 | // perform some clipping | 185 | // perform some clipping |
186 | 186 | ||
187 | if (leftx>=ViewPortRect.UpperLeftCorner.X && | 187 | if (leftx>=ViewPortRect.UpperLeftCorner.X && |
188 | leftx<=ViewPortRect.LowerRightCorner.X) | 188 | leftx<=ViewPortRect.LowerRightCorner.X) |
189 | { | 189 | { |
190 | if (leftZValue > *(zTarget + leftx)) | 190 | if (leftZValue > *(zTarget + leftx)) |
191 | { | 191 | { |
192 | *(zTarget + leftx) = leftZValue; | 192 | *(zTarget + leftx) = leftZValue; |
193 | *(targetSurface + leftx) = color; | 193 | *(targetSurface + leftx) = color; |
194 | } | 194 | } |
195 | } | 195 | } |
196 | 196 | ||
197 | 197 | ||
198 | if (rightx>=ViewPortRect.UpperLeftCorner.X && | 198 | if (rightx>=ViewPortRect.UpperLeftCorner.X && |
199 | rightx<=ViewPortRect.LowerRightCorner.X) | 199 | rightx<=ViewPortRect.LowerRightCorner.X) |
200 | { | 200 | { |
201 | if (rightZValue > *(zTarget + rightx)) | 201 | if (rightZValue > *(zTarget + rightx)) |
202 | { | 202 | { |
203 | *(zTarget + rightx) = rightZValue; | 203 | *(zTarget + rightx) = rightZValue; |
204 | *(targetSurface + rightx) = color; | 204 | *(targetSurface + rightx) = color; |
205 | } | 205 | } |
206 | 206 | ||
207 | } | 207 | } |
208 | 208 | ||
209 | // draw the span | 209 | // draw the span |
210 | 210 | ||
211 | leftxf += leftdeltaxf; | 211 | leftxf += leftdeltaxf; |
212 | rightxf += rightdeltaxf; | 212 | rightxf += rightdeltaxf; |
213 | ++span; | 213 | ++span; |
214 | targetSurface += SurfaceWidth; | 214 | targetSurface += SurfaceWidth; |
215 | zTarget += SurfaceWidth; | 215 | zTarget += SurfaceWidth; |
216 | leftZValue += leftZStep; | 216 | leftZValue += leftZStep; |
217 | rightZValue += rightZStep; | 217 | rightZValue += rightZStep; |
218 | } | 218 | } |
219 | 219 | ||
220 | if (triangleHalf>0) // break, we've gout only two halves | 220 | if (triangleHalf>0) // break, we've gout only two halves |
221 | break; | 221 | break; |
222 | 222 | ||
223 | 223 | ||
224 | // setup variables for second half of the triangle. | 224 | // setup variables for second half of the triangle. |
225 | 225 | ||
226 | if (longest < 0.0f) | 226 | if (longest < 0.0f) |
227 | { | 227 | { |
228 | tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); | 228 | tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); |
229 | 229 | ||
230 | rightdeltaxf = (v3->Pos.X - v2->Pos.X) * tmpDiv; | 230 | rightdeltaxf = (v3->Pos.X - v2->Pos.X) * tmpDiv; |
231 | rightxf = (f32)v2->Pos.X; | 231 | rightxf = (f32)v2->Pos.X; |
232 | 232 | ||
233 | rightZValue = v2->ZValue; | 233 | rightZValue = v2->ZValue; |
234 | rightZStep = (s32)((v3->ZValue - v2->ZValue) * tmpDiv); | 234 | rightZStep = (s32)((v3->ZValue - v2->ZValue) * tmpDiv); |
235 | } | 235 | } |
236 | else | 236 | else |
237 | { | 237 | { |
238 | tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); | 238 | tmpDiv = 1.0f / (v3->Pos.Y - v2->Pos.Y); |
239 | 239 | ||
240 | leftdeltaxf = (v3->Pos.X - v2->Pos.X) * tmpDiv; | 240 | leftdeltaxf = (v3->Pos.X - v2->Pos.X) * tmpDiv; |
241 | leftxf = (f32)v2->Pos.X; | 241 | leftxf = (f32)v2->Pos.X; |
242 | 242 | ||
243 | leftZValue = v2->ZValue; | 243 | leftZValue = v2->ZValue; |
244 | leftZStep = (s32)((v3->ZValue - v2->ZValue) * tmpDiv); | 244 | leftZStep = (s32)((v3->ZValue - v2->ZValue) * tmpDiv); |
245 | } | 245 | } |
246 | 246 | ||
247 | 247 | ||
248 | spanEnd = v3->Pos.Y; | 248 | spanEnd = v3->Pos.Y; |
249 | } | 249 | } |
250 | 250 | ||
251 | } | 251 | } |
252 | 252 | ||
253 | RenderTarget->unlock(); | 253 | RenderTarget->unlock(); |
254 | ZBuffer->unlock(); | 254 | ZBuffer->unlock(); |
255 | } | 255 | } |
256 | }; | 256 | }; |
257 | 257 | ||
258 | } // end namespace video | 258 | } // end namespace video |
259 | } // end namespace irr | 259 | } // end namespace irr |
260 | 260 | ||
261 | #endif // _IRR_COMPILE_WITH_SOFTWARE_ | 261 | #endif // _IRR_COMPILE_WITH_SOFTWARE_ |
262 | 262 | ||
263 | namespace irr | 263 | namespace irr |
264 | { | 264 | { |
265 | namespace video | 265 | namespace video |
266 | { | 266 | { |
267 | 267 | ||
268 | //! creates a flat triangle renderer | 268 | //! creates a flat triangle renderer |
269 | ITriangleRenderer* createTriangleRendererFlatWire(IZBuffer* zbuffer) | 269 | ITriangleRenderer* createTriangleRendererFlatWire(IZBuffer* zbuffer) |
270 | { | 270 | { |
271 | #ifdef _IRR_COMPILE_WITH_SOFTWARE_ | 271 | #ifdef _IRR_COMPILE_WITH_SOFTWARE_ |
272 | return new CTRFlatWire(zbuffer); | 272 | return new CTRFlatWire(zbuffer); |
273 | #else | 273 | #else |
274 | return 0; | 274 | return 0; |
275 | #endif // _IRR_COMPILE_WITH_SOFTWARE_ | 275 | #endif // _IRR_COMPILE_WITH_SOFTWARE_ |
276 | } | 276 | } |
277 | 277 | ||
278 | } // end namespace video | 278 | } // end namespace video |
279 | } // end namespace irr | 279 | } // end namespace irr |
280 | 280 | ||
281 | 281 | ||