diff options
Diffstat (limited to '')
-rw-r--r-- | libraries/irrlicht-1.8/source/Irrlicht/CTRTextureWire2.cpp | 596 |
1 files changed, 298 insertions, 298 deletions
diff --git a/libraries/irrlicht-1.8/source/Irrlicht/CTRTextureWire2.cpp b/libraries/irrlicht-1.8/source/Irrlicht/CTRTextureWire2.cpp index 5cf8b3c..65875bf 100644 --- a/libraries/irrlicht-1.8/source/Irrlicht/CTRTextureWire2.cpp +++ b/libraries/irrlicht-1.8/source/Irrlicht/CTRTextureWire2.cpp | |||
@@ -1,298 +1,298 @@ | |||
1 | // Copyright (C) 2002-2012 Nikolaus Gebhardt / Thomas Alten | 1 | // Copyright (C) 2002-2012 Nikolaus Gebhardt / Thomas Alten |
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 "IBurningShader.h" | 6 | #include "IBurningShader.h" |
7 | 7 | ||
8 | #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ | 8 | #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ |
9 | 9 | ||
10 | // compile flag for this file | 10 | // compile flag for this file |
11 | #undef USE_ZBUFFER | 11 | #undef USE_ZBUFFER |
12 | #undef IPOL_Z | 12 | #undef IPOL_Z |
13 | #undef CMP_Z | 13 | #undef CMP_Z |
14 | #undef WRITE_Z | 14 | #undef WRITE_Z |
15 | 15 | ||
16 | #undef IPOL_W | 16 | #undef IPOL_W |
17 | #undef CMP_W | 17 | #undef CMP_W |
18 | #undef WRITE_W | 18 | #undef WRITE_W |
19 | 19 | ||
20 | #undef SUBTEXEL | 20 | #undef SUBTEXEL |
21 | #undef INVERSE_W | 21 | #undef INVERSE_W |
22 | 22 | ||
23 | #undef IPOL_C0 | 23 | #undef IPOL_C0 |
24 | #undef IPOL_T0 | 24 | #undef IPOL_T0 |
25 | #undef IPOL_T1 | 25 | #undef IPOL_T1 |
26 | 26 | ||
27 | // define render case | 27 | // define render case |
28 | #define SUBTEXEL | 28 | #define SUBTEXEL |
29 | #define INVERSE_W | 29 | #define INVERSE_W |
30 | 30 | ||
31 | #define USE_ZBUFFER | 31 | #define USE_ZBUFFER |
32 | #define IPOL_W | 32 | #define IPOL_W |
33 | #define CMP_W | 33 | #define CMP_W |
34 | #define WRITE_W | 34 | #define WRITE_W |
35 | 35 | ||
36 | 36 | ||
37 | //#define IPOL_C0 | 37 | //#define IPOL_C0 |
38 | #define IPOL_T0 | 38 | #define IPOL_T0 |
39 | //#define IPOL_T1 | 39 | //#define IPOL_T1 |
40 | 40 | ||
41 | // apply global override | 41 | // apply global override |
42 | #ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT | 42 | #ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT |
43 | #undef INVERSE_W | 43 | #undef INVERSE_W |
44 | #endif | 44 | #endif |
45 | 45 | ||
46 | #ifndef SOFTWARE_DRIVER_2_SUBTEXEL | 46 | #ifndef SOFTWARE_DRIVER_2_SUBTEXEL |
47 | #undef SUBTEXEL | 47 | #undef SUBTEXEL |
48 | #endif | 48 | #endif |
49 | 49 | ||
50 | #if !defined ( SOFTWARE_DRIVER_2_USE_WBUFFER ) && defined ( USE_ZBUFFER ) | 50 | #if !defined ( SOFTWARE_DRIVER_2_USE_WBUFFER ) && defined ( USE_ZBUFFER ) |
51 | #ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT | 51 | #ifndef SOFTWARE_DRIVER_2_PERSPECTIVE_CORRECT |
52 | #undef IPOL_W | 52 | #undef IPOL_W |
53 | #endif | 53 | #endif |
54 | #define IPOL_Z | 54 | #define IPOL_Z |
55 | 55 | ||
56 | #ifdef CMP_W | 56 | #ifdef CMP_W |
57 | #undef CMP_W | 57 | #undef CMP_W |
58 | #define CMP_Z | 58 | #define CMP_Z |
59 | #endif | 59 | #endif |
60 | 60 | ||
61 | #ifdef WRITE_W | 61 | #ifdef WRITE_W |
62 | #undef WRITE_W | 62 | #undef WRITE_W |
63 | #define WRITE_Z | 63 | #define WRITE_Z |
64 | #endif | 64 | #endif |
65 | 65 | ||
66 | #endif | 66 | #endif |
67 | 67 | ||
68 | 68 | ||
69 | namespace irr | 69 | namespace irr |
70 | { | 70 | { |
71 | 71 | ||
72 | namespace video | 72 | namespace video |
73 | { | 73 | { |
74 | 74 | ||
75 | class CTRTextureWire2 : public IBurningShader | 75 | class CTRTextureWire2 : public IBurningShader |
76 | { | 76 | { |
77 | public: | 77 | public: |
78 | 78 | ||
79 | //! constructor | 79 | //! constructor |
80 | CTRTextureWire2(CBurningVideoDriver* driver); | 80 | CTRTextureWire2(CBurningVideoDriver* driver); |
81 | 81 | ||
82 | //! draws an indexed triangle list | 82 | //! draws an indexed triangle list |
83 | virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ); | 83 | virtual void drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ); |
84 | virtual void drawLine ( const s4DVertex *a,const s4DVertex *b); | 84 | virtual void drawLine ( const s4DVertex *a,const s4DVertex *b); |
85 | 85 | ||
86 | 86 | ||
87 | 87 | ||
88 | private: | 88 | private: |
89 | void renderAlphaLine ( const s4DVertex *a,const s4DVertex *b ) const; | 89 | void renderAlphaLine ( const s4DVertex *a,const s4DVertex *b ) const; |
90 | void renderLine ( const s4DVertex *a,const s4DVertex *b ) const; | 90 | void renderLine ( const s4DVertex *a,const s4DVertex *b ) const; |
91 | 91 | ||
92 | }; | 92 | }; |
93 | 93 | ||
94 | //! constructor | 94 | //! constructor |
95 | CTRTextureWire2::CTRTextureWire2(CBurningVideoDriver* driver) | 95 | CTRTextureWire2::CTRTextureWire2(CBurningVideoDriver* driver) |
96 | : IBurningShader(driver) | 96 | : IBurningShader(driver) |
97 | { | 97 | { |
98 | #ifdef _DEBUG | 98 | #ifdef _DEBUG |
99 | setDebugName("CTRTextureWire2"); | 99 | setDebugName("CTRTextureWire2"); |
100 | #endif | 100 | #endif |
101 | } | 101 | } |
102 | 102 | ||
103 | 103 | ||
104 | // swap integer with xor | 104 | // swap integer with xor |
105 | static inline void swap_xor ( s32 &a, s32 &b ) | 105 | static inline void swap_xor ( s32 &a, s32 &b ) |
106 | { | 106 | { |
107 | a ^= b; | 107 | a ^= b; |
108 | b ^= a; | 108 | b ^= a; |
109 | a ^= b; | 109 | a ^= b; |
110 | } | 110 | } |
111 | 111 | ||
112 | 112 | ||
113 | /*! | 113 | /*! |
114 | */ | 114 | */ |
115 | void CTRTextureWire2::renderLine ( const s4DVertex *a,const s4DVertex *b ) const | 115 | void CTRTextureWire2::renderLine ( const s4DVertex *a,const s4DVertex *b ) const |
116 | { | 116 | { |
117 | 117 | ||
118 | int pitch0 = RenderTarget->getDimension().Width << VIDEO_SAMPLE_GRANULARITY; | 118 | int pitch0 = RenderTarget->getDimension().Width << VIDEO_SAMPLE_GRANULARITY; |
119 | int pitch1 = RenderTarget->getDimension().Width << 2; | 119 | int pitch1 = RenderTarget->getDimension().Width << 2; |
120 | 120 | ||
121 | int aposx = (int) a->Pos.x; | 121 | int aposx = (int) a->Pos.x; |
122 | int aposy = (int) a->Pos.y; | 122 | int aposy = (int) a->Pos.y; |
123 | int bposx = (int) b->Pos.x; | 123 | int bposx = (int) b->Pos.x; |
124 | int bposy = (int) b->Pos.y; | 124 | int bposy = (int) b->Pos.y; |
125 | 125 | ||
126 | int dx = bposx - aposx; | 126 | int dx = bposx - aposx; |
127 | int dy = bposy - aposy; | 127 | int dy = bposy - aposy; |
128 | 128 | ||
129 | int c; | 129 | int c; |
130 | int m; | 130 | int m; |
131 | int d = 0; | 131 | int d = 0; |
132 | int run; | 132 | int run; |
133 | 133 | ||
134 | tVideoSample *dst; | 134 | tVideoSample *dst; |
135 | #ifdef USE_ZBUFFER | 135 | #ifdef USE_ZBUFFER |
136 | fp24 *z; | 136 | fp24 *z; |
137 | #endif | 137 | #endif |
138 | 138 | ||
139 | int xInc0 = 1 << VIDEO_SAMPLE_GRANULARITY; | 139 | int xInc0 = 1 << VIDEO_SAMPLE_GRANULARITY; |
140 | int yInc0 = pitch0; | 140 | int yInc0 = pitch0; |
141 | 141 | ||
142 | int xInc1 = 4; | 142 | int xInc1 = 4; |
143 | int yInc1 = pitch1; | 143 | int yInc1 = pitch1; |
144 | 144 | ||
145 | tVideoSample color; | 145 | tVideoSample color; |
146 | 146 | ||
147 | #ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR | 147 | #ifdef SOFTWARE_DRIVER_2_USE_VERTEX_COLOR |
148 | tFixPoint r0, g0, b0; | 148 | tFixPoint r0, g0, b0; |
149 | getSample_color ( r0, g0, b0, a->Color[0] ); | 149 | getSample_color ( r0, g0, b0, a->Color[0] ); |
150 | color = fix_to_color ( r0, g0, b0 ); | 150 | color = fix_to_color ( r0, g0, b0 ); |
151 | #else | 151 | #else |
152 | color = (tVideoSample) 0xFFFFFFFF; | 152 | color = (tVideoSample) 0xFFFFFFFF; |
153 | #endif | 153 | #endif |
154 | 154 | ||
155 | if ( dx < 0 ) | 155 | if ( dx < 0 ) |
156 | { | 156 | { |
157 | xInc0 = - ( 1 << VIDEO_SAMPLE_GRANULARITY); | 157 | xInc0 = - ( 1 << VIDEO_SAMPLE_GRANULARITY); |
158 | xInc1 = -4; | 158 | xInc1 = -4; |
159 | dx = -dx; | 159 | dx = -dx; |
160 | } | 160 | } |
161 | 161 | ||
162 | if ( dy > dx ) | 162 | if ( dy > dx ) |
163 | { | 163 | { |
164 | swap_xor ( dx, dy ); | 164 | swap_xor ( dx, dy ); |
165 | swap_xor ( xInc0, yInc0 ); | 165 | swap_xor ( xInc0, yInc0 ); |
166 | swap_xor ( xInc1, yInc1 ); | 166 | swap_xor ( xInc1, yInc1 ); |
167 | } | 167 | } |
168 | 168 | ||
169 | if ( 0 == dx ) | 169 | if ( 0 == dx ) |
170 | return; | 170 | return; |
171 | 171 | ||
172 | dst = (tVideoSample*) ( (u8*) (tVideoSample*)RenderTarget->lock() + ( aposy * pitch0 ) + (aposx << VIDEO_SAMPLE_GRANULARITY ) ); | 172 | dst = (tVideoSample*) ( (u8*) (tVideoSample*)RenderTarget->lock() + ( aposy * pitch0 ) + (aposx << VIDEO_SAMPLE_GRANULARITY ) ); |
173 | #ifdef USE_ZBUFFER | 173 | #ifdef USE_ZBUFFER |
174 | z = (fp24*) ( (u8*) (fp24*) DepthBuffer->lock() + ( aposy * pitch1 ) + (aposx << 2 ) ); | 174 | z = (fp24*) ( (u8*) (fp24*) DepthBuffer->lock() + ( aposy * pitch1 ) + (aposx << 2 ) ); |
175 | #endif | 175 | #endif |
176 | 176 | ||
177 | c = dx << 1; | 177 | c = dx << 1; |
178 | m = dy << 1; | 178 | m = dy << 1; |
179 | 179 | ||
180 | #ifdef IPOL_Z | 180 | #ifdef IPOL_Z |
181 | f32 slopeZ = (b->Pos.z - a->Pos.z) / f32(dx); | 181 | f32 slopeZ = (b->Pos.z - a->Pos.z) / f32(dx); |
182 | f32 dataZ = a->Pos.z; | 182 | f32 dataZ = a->Pos.z; |
183 | #endif | 183 | #endif |
184 | 184 | ||
185 | #ifdef IPOL_W | 185 | #ifdef IPOL_W |
186 | fp24 slopeW = (b->Pos.w - a->Pos.w) / f32( dx ); | 186 | fp24 slopeW = (b->Pos.w - a->Pos.w) / f32( dx ); |
187 | fp24 dataW = a->Pos.w; | 187 | fp24 dataW = a->Pos.w; |
188 | #endif | 188 | #endif |
189 | 189 | ||
190 | run = dx; | 190 | run = dx; |
191 | while ( run ) | 191 | while ( run ) |
192 | { | 192 | { |
193 | #ifdef CMP_Z | 193 | #ifdef CMP_Z |
194 | if ( *z >= dataZ ) | 194 | if ( *z >= dataZ ) |
195 | #endif | 195 | #endif |
196 | #ifdef CMP_W | 196 | #ifdef CMP_W |
197 | if ( dataW >= *z ) | 197 | if ( dataW >= *z ) |
198 | #endif | 198 | #endif |
199 | { | 199 | { |
200 | #ifdef WRITE_Z | 200 | #ifdef WRITE_Z |
201 | *z = dataZ; | 201 | *z = dataZ; |
202 | #endif | 202 | #endif |
203 | #ifdef WRITE_W | 203 | #ifdef WRITE_W |
204 | *z = dataW; | 204 | *z = dataW; |
205 | #endif | 205 | #endif |
206 | 206 | ||
207 | *dst = color; | 207 | *dst = color; |
208 | 208 | ||
209 | } | 209 | } |
210 | 210 | ||
211 | dst = (tVideoSample*) ( (u8*) dst + xInc0 ); // x += xInc | 211 | dst = (tVideoSample*) ( (u8*) dst + xInc0 ); // x += xInc |
212 | #ifdef IPOL_Z | 212 | #ifdef IPOL_Z |
213 | z = (fp24*) ( (u8*) z + xInc1 ); | 213 | z = (fp24*) ( (u8*) z + xInc1 ); |
214 | #endif | 214 | #endif |
215 | #ifdef IPOL_W | 215 | #ifdef IPOL_W |
216 | z = (fp24*) ( (u8*) z + xInc1 ); | 216 | z = (fp24*) ( (u8*) z + xInc1 ); |
217 | #endif | 217 | #endif |
218 | 218 | ||
219 | d += m; | 219 | d += m; |
220 | if ( d > dx ) | 220 | if ( d > dx ) |
221 | { | 221 | { |
222 | dst = (tVideoSample*) ( (u8*) dst + yInc0 ); // y += yInc | 222 | dst = (tVideoSample*) ( (u8*) dst + yInc0 ); // y += yInc |
223 | #ifdef IPOL_Z | 223 | #ifdef IPOL_Z |
224 | z = (fp24*) ( (u8*) z + yInc1 ); | 224 | z = (fp24*) ( (u8*) z + yInc1 ); |
225 | #endif | 225 | #endif |
226 | #ifdef IPOL_W | 226 | #ifdef IPOL_W |
227 | z = (fp24*) ( (u8*) z + yInc1 ); | 227 | z = (fp24*) ( (u8*) z + yInc1 ); |
228 | #endif | 228 | #endif |
229 | 229 | ||
230 | d -= c; | 230 | d -= c; |
231 | } | 231 | } |
232 | run -= 1; | 232 | run -= 1; |
233 | #ifdef IPOL_Z | 233 | #ifdef IPOL_Z |
234 | dataZ += slopeZ; | 234 | dataZ += slopeZ; |
235 | #endif | 235 | #endif |
236 | #ifdef IPOL_W | 236 | #ifdef IPOL_W |
237 | dataW += slopeW; | 237 | dataW += slopeW; |
238 | #endif | 238 | #endif |
239 | 239 | ||
240 | } | 240 | } |
241 | 241 | ||
242 | } | 242 | } |
243 | 243 | ||
244 | void CTRTextureWire2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) | 244 | void CTRTextureWire2::drawTriangle ( const s4DVertex *a,const s4DVertex *b,const s4DVertex *c ) |
245 | { | 245 | { |
246 | sScanLineData line; | 246 | sScanLineData line; |
247 | 247 | ||
248 | // sort on height, y | 248 | // sort on height, y |
249 | if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); | 249 | if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); |
250 | if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c); | 250 | if ( F32_A_GREATER_B ( b->Pos.y , c->Pos.y ) ) swapVertexPointer(&b, &c); |
251 | if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); | 251 | if ( F32_A_GREATER_B ( a->Pos.y , b->Pos.y ) ) swapVertexPointer(&a, &b); |
252 | 252 | ||
253 | renderLine ( a, b ); | 253 | renderLine ( a, b ); |
254 | renderLine ( b, c ); | 254 | renderLine ( b, c ); |
255 | renderLine ( a, c ); | 255 | renderLine ( a, c ); |
256 | 256 | ||
257 | } | 257 | } |
258 | 258 | ||
259 | 259 | ||
260 | void CTRTextureWire2::drawLine ( const s4DVertex *a,const s4DVertex *b) | 260 | void CTRTextureWire2::drawLine ( const s4DVertex *a,const s4DVertex *b) |
261 | { | 261 | { |
262 | 262 | ||
263 | // query access to TexMaps | 263 | // query access to TexMaps |
264 | 264 | ||
265 | // sort on height, y | 265 | // sort on height, y |
266 | if ( a->Pos.y > b->Pos.y ) swapVertexPointer(&a, &b); | 266 | if ( a->Pos.y > b->Pos.y ) swapVertexPointer(&a, &b); |
267 | 267 | ||
268 | renderLine ( a, b ); | 268 | renderLine ( a, b ); |
269 | 269 | ||
270 | } | 270 | } |
271 | 271 | ||
272 | 272 | ||
273 | } // end namespace video | 273 | } // end namespace video |
274 | } // end namespace irr | 274 | } // end namespace irr |
275 | 275 | ||
276 | #endif // _IRR_COMPILE_WITH_BURNINGSVIDEO_ | 276 | #endif // _IRR_COMPILE_WITH_BURNINGSVIDEO_ |
277 | 277 | ||
278 | namespace irr | 278 | namespace irr |
279 | { | 279 | { |
280 | namespace video | 280 | namespace video |
281 | { | 281 | { |
282 | 282 | ||
283 | 283 | ||
284 | //! creates a flat triangle renderer | 284 | //! creates a flat triangle renderer |
285 | IBurningShader* createTriangleRendererTextureGouraudWire2(CBurningVideoDriver* driver) | 285 | IBurningShader* createTriangleRendererTextureGouraudWire2(CBurningVideoDriver* driver) |
286 | { | 286 | { |
287 | #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ | 287 | #ifdef _IRR_COMPILE_WITH_BURNINGSVIDEO_ |
288 | return new CTRTextureWire2(driver); | 288 | return new CTRTextureWire2(driver); |
289 | #else | 289 | #else |
290 | return 0; | 290 | return 0; |
291 | #endif // _IRR_COMPILE_WITH_BURNINGSVIDEO_ | 291 | #endif // _IRR_COMPILE_WITH_BURNINGSVIDEO_ |
292 | } | 292 | } |
293 | 293 | ||
294 | 294 | ||
295 | } // end namespace video | 295 | } // end namespace video |
296 | } // end namespace irr | 296 | } // end namespace irr |
297 | 297 | ||
298 | 298 | ||