1 #ifdef GL_HERETIC
2
3 //#define __DOOMTYPE__
4
5 #include <stdio.h>
6 #include <string.h>
7 #include <math.h>
8 #include <unistd.h>
9
10 #include "gl_syms.h"
11
12 #include "gl_struct.h"
13 #include "gl_mem.h"
14 #ifndef GL_HEXEN
15 #include "doomdef.h"
16 #else
17 #include "h2def.h"
18 #endif
19 #include "r_local.h"
20 #if defined(DOOM_GL) /*|| defined(GL_HEXEN)*/
21 #include "p_spec.h"
22 #endif
23
24 #include "p_local.h"
25
26 /*extern int numvertexes;
27 extern vertex_t *vertexes;
28 extern int numsectors;
29 extern sector_t *sectors;
30 extern int numsides;
31 extern side_t *sides;
32 extern int numlines;
33 extern line_t *lines;*/
34
35 extern GLTexture *p_stGLTextures;
36 extern int iNbTexturesInMap;
37
38 extern GLuint *texobjs;
39 extern int iLightLevelMin,iLightLevelMax;
40
41 extern int *a_iGlDrawLine;
42
43 extern int *a_iGLTexTranslation;
44 extern int glSwitchList[MAXSWITCHES * 2];
45
46 extern int g_iMovingSector;
47 GLWallImpact *g_a_stWallImpacts;
48 long g_iMaxImpacts=10;
49
50 #ifndef WALL_ARRAY
51 int *iWall;
52 int startWallList;
53
fn_vRenderWall(short sTexture,short xOffset,short yOffset,float fCeilingHeight,float fFloorHeight,float x1,float y1,float z1,float x2,float y2,float z2,float fWallWidth,char cWallType,float fLightLevel,short flags)54 void fn_vRenderWall(short sTexture,short xOffset,short yOffset,float fCeilingHeight,float fFloorHeight,float x1,float y1,float z1,float x2,float y2,float z2,float fWallWidth,char cWallType,float fLightLevel,short flags)
55 // CWallType&0x80 ==1 => back-face
56 // CWallType&0x0F ==0 => MidTex
57 // CWallType&0x0F ==1 => TopTex
58 // CWallType&0x0F ==2 => BotTex
59 {
60 float fU1,fU2,fV1,fV2,fU1Off,fV1Off;
61 int iSubTex;
62 int iGLTex;
63
64 //iGLTex=fn_iGetGLTexturef(szTexName,xOffset,yOffset,&fU1,&fU2,&fV1,&fV2,&fU1Off,&fV1Off,&iSubTex);
65 iGLTex=fn_iGetGLTexturef(sTexture,xOffset,yOffset,&fU1,&fU2,&fV1,&fV2,&fU1Off,&fV1Off,&iSubTex);
66
67 if (iGLTex==-1)
68 printf("[SDLGLdrv/walls] Prout");
69
70 if (xOffset>=p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iWidth)
71 xOffset=0;
72 if (yOffset>=p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight)
73 yOffset=0;
74
75
76 (*glBindTexture_s) (GL_TEXTURE_2D, texobjs[iGLTex]);
77 #ifdef BILINEAR
78 if (p_stGLTextures[iGLTex].a_stSubTex[iSubTex].bIsNZ)
79 {
80 (*glEnable_s) (GL_ALPHA_TEST);
81 // MR3006
82 (*glAlphaFunc_s) (GL_NOTEQUAL,0.0f);
83 (*glEnable_s) (GL_BLEND);
84 (*glBlendFunc_s) (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
85 /* (*glAlphaFunc_s) (GL_EQUAL,1.0f);
86 (*glTexParameterf_s) (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
87 (*glTexParameterf_s) (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);*/
88 }
89 #endif
90 (*glBegin_s) (GL_QUADS);
91
92 GL_StaticLight3f(fLightLevel,fLightLevel,fLightLevel);
93
94 fU2=fU1Off+(float)fWallWidth/p_stGLTextures[iGLTex].iWidth;
95
96 if (((cWallType&0x0F)==2)&&(flags & ML_DONTPEGBOTTOM))
97 {
98 fV1=fV1Off;
99 //fV1Off=fV1+(float)(fabs(fCeilingHeight-y1)*MAP_SCALE)/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
100 fV1Off=fV1+(float)(fabs(fCeilingHeight-y1)*(MAP_SCALE>>FRACBITS))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
101 //fV2=fV1+(float)(fabs(fCeilingHeight-fFloorHeight)*MAP_SCALE)/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
102 fV2=fV1+(float)(fabs(fCeilingHeight-fFloorHeight)*(MAP_SCALE>>FRACBITS))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
103 }
104 else
105 if ((((cWallType&0x0f)==0)&&(flags & ML_DONTPEGBOTTOM)&&(!(flags & ML_DONTPEGTOP)))||
106 (((cWallType&0x0f)==1)&&(!(flags & ML_DONTPEGTOP))))
107 { fV2=fV1Off;
108 //fV1Off=fV2-((float)(fabs(y2-y1)*MAP_SCALE))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
109 fV1Off=fV2-((float)(fabs(y2-y1)*(MAP_SCALE>>FRACBITS)))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
110 }
111 else
112 //fV2=fV1Off+((float)(fabs(y2-y1)*MAP_SCALE))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
113 fV2=fV1Off+((float)(fabs(y2-y1)*(MAP_SCALE>>FRACBITS)))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
114
115 (*glTexCoord2f_s) (fU1Off, fV1Off); (*glVertex3f_s) ( x1, y1, z1);
116 (*glTexCoord2f_s) (fU1Off, fV2); (*glVertex3f_s) ( x1, y2, z1);
117 (*glTexCoord2f_s) (fU2, fV2); (*glVertex3f_s) ( x2, y2, z2);
118 (*glTexCoord2f_s) (fU2, fV1Off); (*glVertex3f_s) ( x2, y1, z2);
119 (*glEnd_s) ();
120
121 #ifdef BILINEAR
122 if (p_stGLTextures[iGLTex].a_stSubTex[iSubTex].bIsNZ)
123 {
124 (*glDisable_s) (GL_ALPHA_TEST);
125 // MR3006
126 (*glDisable_s) (GL_BLEND);
127 /*(*glTexParameterf_s) (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
128 (*glTexParameterf_s) (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);*/
129 }
130 #endif
131 }
132 #else // WALL_ARRAY
133 GLWallPolygonArray *a_stWallPoly;
134 int iCurrentWall;
135 sector_t *pCurrentSector;
136
fn_vRenderWall(short sTexture,short xOffset,short yOffset,float fCeilingHeight,float fFloorHeight,float x1,float y1,float z1,float x2,float y2,float z2,float fWallWidth,char cWallType,float fLightLevel,short flags)137 void fn_vRenderWall(short sTexture,short xOffset,short yOffset,float fCeilingHeight,float fFloorHeight,float x1,float y1,float z1,float x2,float y2,float z2,float fWallWidth,char cWallType,float fLightLevel,short flags)
138 // CWallType&0x80 ==1 => back-face
139 // CWallType&0x0F ==0 => MidTex
140 // CWallType&0x0F ==1 => TopTex
141 // CWallType&0x0F ==2 => BotTex
142 {
143 float fU1,fU2,fV1,fV2,fU1Off,fV1Off;
144 int iSubTex;
145 int iGLTex;
146
147 iGLTex=fn_iGetGLTexturef(sTexture,xOffset,yOffset,&fU1,&fU2,&fV1,&fV2,&fU1Off,&fV1Off,&iSubTex);
148
149 if (iGLTex==-1)
150 { //printf("Prout");
151 iGLTex=0; // !!! anti-bug (cf waggle in Hexen)
152 }
153
154 // if (iGLTex==15)
155 // fn_vSaveRAW("prout2.raw",p_stGLTextures[15].p_bRGBBuffer,p_stGLTextures[15].iWidth,p_stGLTextures[15].iHeight);
156
157 if (xOffset>=p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iWidth)
158 xOffset=0;
159 if (yOffset>=p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight)
160 yOffset=0;
161
162
163 GL_StaticLight3f(fLightLevel,fLightLevel,fLightLevel);
164
165 //fU2=fU1Off+(float)fWallWidth/p_stGLTextures[iGLTex].iWidth; // DOOM_GL
166 fU2=fU1Off+(float)fWallWidth/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iWidth;
167
168 if (((cWallType&0x0f)==2)&&(flags & ML_DONTPEGBOTTOM))
169 {
170 fV1=fV1Off;
171 //fV1Off=fV1+(float)(fabs(fCeilingHeight-y1)*MAP_SCALE)/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
172 fV1Off=fV1+(float)(fabs(fCeilingHeight-y1)*(MAP_SCALE>>FRACBITS))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
173 //fV2=fV1+(float)(fabs(fCeilingHeight-fFloorHeight)*MAP_SCALE)/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
174 fV2=fV1+(float)(fabs(fCeilingHeight-fFloorHeight)*(MAP_SCALE>>FRACBITS))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
175 }
176 else
177 if ((((cWallType&0x0f)==0)&&(flags & ML_DONTPEGBOTTOM)&&(!(flags & ML_DONTPEGTOP)))||
178 (((cWallType&0x0f)==1)&&(!(flags & ML_DONTPEGTOP))))
179 { fV2=fV1Off;
180 //fV1Off=fV2-((float)(fabs(y2-y1)*MAP_SCALE))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
181 fV1Off=fV2-((float)(fabs(y2-y1)*(MAP_SCALE>>FRACBITS)))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
182 }
183 else
184 //fV2=fV1Off+((float)(fabs(y2-y1)*MAP_SCALE))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
185 fV2=fV1Off+((float)(fabs(y2-y1)*(MAP_SCALE>>FRACBITS)))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
186
187 a_stWallPoly[iCurrentWall].iNbQuads++;
188 a_stWallPoly[iCurrentWall].p_stWallQuad=(GLWallQuad *)Realloc(a_stWallPoly[iCurrentWall].p_stWallQuad,a_stWallPoly[iCurrentWall].iNbQuads*sizeof(GLWallQuad));
189
190 a_stWallPoly[iCurrentWall].p_stWallQuad[a_stWallPoly[iCurrentWall].iNbQuads-1].a_fVertex[0]=x1;
191 a_stWallPoly[iCurrentWall].p_stWallQuad[a_stWallPoly[iCurrentWall].iNbQuads-1].a_fVertex[1]=y1;
192 a_stWallPoly[iCurrentWall].p_stWallQuad[a_stWallPoly[iCurrentWall].iNbQuads-1].a_fVertex[2]=z1;
193 a_stWallPoly[iCurrentWall].p_stWallQuad[a_stWallPoly[iCurrentWall].iNbQuads-1].a_fVertex[3]=x2;
194 a_stWallPoly[iCurrentWall].p_stWallQuad[a_stWallPoly[iCurrentWall].iNbQuads-1].a_fVertex[4]=y2;
195 a_stWallPoly[iCurrentWall].p_stWallQuad[a_stWallPoly[iCurrentWall].iNbQuads-1].a_fVertex[5]=z2;
196 a_stWallPoly[iCurrentWall].p_stWallQuad[a_stWallPoly[iCurrentWall].iNbQuads-1].a_fUV[0]=fU1Off;
197 a_stWallPoly[iCurrentWall].p_stWallQuad[a_stWallPoly[iCurrentWall].iNbQuads-1].a_fUV[1]=fV1Off;
198 a_stWallPoly[iCurrentWall].p_stWallQuad[a_stWallPoly[iCurrentWall].iNbQuads-1].a_fUV[2]=fU2;
199 a_stWallPoly[iCurrentWall].p_stWallQuad[a_stWallPoly[iCurrentWall].iNbQuads-1].a_fUV[3]=fV2;
200 a_stWallPoly[iCurrentWall].p_stWallQuad[a_stWallPoly[iCurrentWall].iNbQuads-1].iTex=iGLTex;
201 a_stWallPoly[iCurrentWall].p_stWallQuad[a_stWallPoly[iCurrentWall].iNbQuads-1].pSector=pCurrentSector;
202 a_stWallPoly[iCurrentWall].p_stWallQuad[a_stWallPoly[iCurrentWall].iNbQuads-1].cWallType=cWallType;
203 }
204
205 #ifdef GL_HEXEN
GL_UpdateWallCoordinates(int iLineID,float fCeiling,float fFloor)206 void GL_UpdateWallCoordinates(int iLineID,float fCeiling,float fFloor)
207 { float x1,z1,x2,z2;
208
209 x1=-(float)lines[iLineID].v1->x/MAP_SCALE;
210 x2=-(float)lines[iLineID].v2->x/MAP_SCALE;
211 z1=(float)lines[iLineID].v1->y/MAP_SCALE;
212 z2=(float)lines[iLineID].v2->y/MAP_SCALE;
213
214 a_stWallPoly[iLineID].p_stWallQuad[0].a_fVertex[0]=x1;
215 a_stWallPoly[iLineID].p_stWallQuad[0].a_fVertex[1]=fCeiling;
216 a_stWallPoly[iLineID].p_stWallQuad[0].a_fVertex[2]=z1;
217 a_stWallPoly[iLineID].p_stWallQuad[0].a_fVertex[3]=x2;
218 a_stWallPoly[iLineID].p_stWallQuad[0].a_fVertex[4]=fFloor;
219 a_stWallPoly[iLineID].p_stWallQuad[0].a_fVertex[5]=z2;
220 }
221 #endif // GL_HEXEN
222 #endif // WALL_ARRAY
223
fn_vComputeLightLevels()224 void fn_vComputeLightLevels()
225 { int s;
226 for (s=0;s<numsectors;s++)
227 { if (sectors[s].lightlevel>iLightLevelMax)
228 iLightLevelMax=sectors[s].lightlevel;
229 if (sectors[s].lightlevel<iLightLevelMin)
230 iLightLevelMin=sectors[s].lightlevel;
231 }
232 iLightLevelMin-=10;
233 iLightLevelMax+=10;
234 if (iLightLevelMin<0)
235 iLightLevelMin=0;
236 if (iLightLevelMax>255)
237 iLightLevelMax=255;
238
239 // MR
240 //iLightLevelMin=-1;
241 iLightLevelMin=0;
242 iLightLevelMax=255;
243 }
244
fn_vCreateWallsPolygons(int i)245 void fn_vCreateWallsPolygons(int i)
246 {
247 float x1,y1,x2,y2,z1,z2;
248 float fWallWidth;
249 short xOffset,yOffset;
250 GLboolean bDrawWallMid,bDrawWallBot,bDrawWallUp;
251 float fLightLevel, fCeilingHeight0, fFloorHeight0, fCeilingHeight1=0.0f, fFloorHeight1=0.0f;
252
253 #ifndef WALL_ARRAY
254 glNewList(startWallList+i, GL_COMPILE);
255 iWall[i]=startWallList+i;
256 #else
257 /* if (a_stWallPoly[i].iNbQuads) // GL_HEXEN (Cf waggle)
258 return;*/
259 iCurrentWall=i;
260 a_stWallPoly[iCurrentWall].iNbQuads=0;
261 a_stWallPoly[iCurrentWall].p_stWallQuad=(GLWallQuad *)Malloc(sizeof(GLWallQuad));
262 #endif
263
264 x1=-(float)lines[i].v1->x/MAP_SCALE;
265 x2=-(float)lines[i].v2->x/MAP_SCALE;
266 z1=(float)lines[i].v1->y/MAP_SCALE;
267 z2=(float)lines[i].v2->y/MAP_SCALE;
268
269 /*fWallWidth=(float)sqrt(
270 (float)(lines[i].v1->x-lines[i].v2->x)*(lines[i].v1->x-lines[i].v2->x)+
271 (float)(lines[i].v1->y-lines[i].v2->y)*(lines[i].v1->y-lines[i].v2->y)); */
272 fWallWidth=(float)sqrt(
273 (float)((lines[i].v1->x>>FRACBITS)-(lines[i].v2->x>>FRACBITS))*((lines[i].v1->x>>FRACBITS)-(lines[i].v2->x>>FRACBITS))+
274 (float)((lines[i].v1->y>>FRACBITS)-(lines[i].v2->y>>FRACBITS))*((lines[i].v1->y>>FRACBITS)-(lines[i].v2->y>>FRACBITS)));
275
276 bDrawWallMid=FALSE;
277 bDrawWallBot=FALSE;
278 bDrawWallUp=FALSE;
279
280 //xOffset=sides[lines[i].sidenum[0]].textureoffset;
281 //yOffset=sides[lines[i].sidenum[0]].rowoffset;
282 xOffset=sides[lines[i].sidenum[0]].textureoffset>>FRACBITS;
283 yOffset=sides[lines[i].sidenum[0]].rowoffset>>FRACBITS;
284
285 fLightLevel=(float)(sides[lines[i].sidenum[0]].sector->lightlevel-iLightLevelMin)/(float)(iLightLevelMax-iLightLevelMin);
286 #ifdef WALL_ARRAY
287 pCurrentSector=sides[lines[i].sidenum[0]].sector;
288 a_stWallPoly[iCurrentWall].fWallWidth=fWallWidth;
289 #endif
290
291 // GL_HEXEN
292 /* fCeilingHeight0=(float)sides[lines[i].sidenum[0]].sector->ceilingheight/MAP_SCALE;
293 fFloorHeight0=(float)sides[lines[i].sidenum[0]].sector->floorheight/MAP_SCALE;
294 fCeilingHeight1=(float)sides[lines[i].sidenum[1]].sector->ceilingheight/MAP_SCALE;
295 fFloorHeight1=(float)sides[lines[i].sidenum[1]].sector->floorheight/MAP_SCALE;
296 */
297 fCeilingHeight0=(float)lines[i].frontsector->ceilingheight/MAP_SCALE;
298 fFloorHeight0=(float)lines[i].frontsector->floorheight/MAP_SCALE;
299 if (lines[i].backsector)
300 { fCeilingHeight1=(float)lines[i].backsector->ceilingheight/MAP_SCALE;
301 fFloorHeight1=(float)lines[i].backsector->floorheight/MAP_SCALE;
302 }
303 // End GL_HEXEN
304
305 // MR2506
306 if (lines[i].sidenum[1]==-1)
307 { if (sides[lines[i].sidenum[0]].midtexture!=R_TextureNumForName("-"))
308 {
309 y1=fCeilingHeight0;
310 y2=fFloorHeight0;
311
312 fn_vRenderWall(sides[lines[i].sidenum[0]].midtexture,xOffset,yOffset,fCeilingHeight0,fFloorHeight0,x1,y1,z1,x2,y2,z2,fWallWidth,0,fLightLevel,lines[i].flags);
313 bDrawWallMid=TRUE;
314 }
315 }
316 // MR2506
317 else
318 { if (sides[lines[i].sidenum[0]].midtexture!=R_TextureNumForName("-"))
319 {
320 /*y1=fCeilingHeight1;
321 y2=fFloorHeight1;*/
322 y1=fCeilingHeight1>fCeilingHeight0?fCeilingHeight0:fCeilingHeight1;
323 y2=fFloorHeight1>fFloorHeight0?fFloorHeight1:fFloorHeight0;
324
325 fn_vRenderWall(sides[lines[i].sidenum[0]].midtexture,xOffset,yOffset,fCeilingHeight0,fFloorHeight0,x1,y1,z1,x2,y2,z2,fWallWidth,0,fLightLevel,lines[i].flags);
326 bDrawWallMid=TRUE;
327 }
328 }
329
330 if (sides[lines[i].sidenum[0]].bottomtexture!=R_TextureNumForName("-"))
331 {
332 y2=fFloorHeight0;
333 y1=fFloorHeight1;
334
335 fn_vRenderWall(sides[lines[i].sidenum[0]].bottomtexture,xOffset,yOffset,fCeilingHeight0,fFloorHeight0,x1,y1,z1,x2,y2,z2,fWallWidth,2,fLightLevel,lines[i].flags);
336 bDrawWallBot=TRUE;
337 }
338
339 #ifndef GL_HEXEN
340 if ((sides[lines[i].sidenum[0]].toptexture!=R_TextureNumForName("-"))&&
341 !((lines[i].frontsector->ceilingpic==R_FlatNumForName("F_SKY1"))&&
342 lines[i].backsector&&
343 (lines[i].backsector->ceilingpic==R_FlatNumForName("F_SKY1")))) // DOOM_GL (cf E1M1 line 251)
344 #else
345 if ((sides[lines[i].sidenum[0]].toptexture!=R_TextureNumForName("-"))&&
346 !((lines[i].frontsector->ceilingpic==R_FlatNumForName("F_SKY"))&&
347 lines[i].backsector&&
348 (lines[i].backsector->ceilingpic==R_FlatNumForName("F_SKY")))) // DOOM_GL (cf E1M1 line 251)
349 #endif
350 {
351
352 y1=fCeilingHeight0;
353 y2=fCeilingHeight1;
354
355 fn_vRenderWall(sides[lines[i].sidenum[0]].toptexture,xOffset,yOffset,fCeilingHeight0,fFloorHeight0,x1,y1,z1,x2,y2,z2,fWallWidth,1,fLightLevel,lines[i].flags);
356 bDrawWallUp=TRUE;
357 }
358
359 if (lines[i].sidenum[1]!=-1)
360 { xOffset=sides[lines[i].sidenum[1]].textureoffset>>FRACBITS;
361 yOffset=sides[lines[i].sidenum[1]].rowoffset>>FRACBITS;
362 //fLightLevel=(float)sectors[sides[lines[i].sidenum[1]].sector].lightlevel/255;
363 fLightLevel=(float)(sides[lines[i].sidenum[1]].sector->lightlevel-iLightLevelMin)/(float)(iLightLevelMax-iLightLevelMin);
364 #ifdef WALL_ARRAY
365 pCurrentSector=sides[lines[i].sidenum[1]].sector;
366 #endif
367 { if (sides[lines[i].sidenum[1]].midtexture!=R_TextureNumForName("-"))
368 {
369 /*y1=fCeilingHeight1;
370 y2=fFloorHeight1;*/
371 y1=fCeilingHeight1>fCeilingHeight0?fCeilingHeight0:fCeilingHeight1;
372 y2=fFloorHeight1>fFloorHeight0?fFloorHeight1:fFloorHeight0;
373 if (!bDrawWallMid)
374 fn_vRenderWall(sides[lines[i].sidenum[1]].midtexture,xOffset,yOffset,fCeilingHeight1,fFloorHeight1,x1,y1,z1,x2,y2,z2,fWallWidth,0,fLightLevel,lines[i].flags);
375 // No back-face for midText... (Cf spider webs)
376 else // back-face
377 { //float fDFaces=0.5f/MAP_SCALE; // Distance between 2 faces...
378 float x1b,z1b,x2b,z2b/*,fWidth*/;
379
380 //fWidth=fWallWidth/(MAP_SCALE>>FRACBITS);
381 //x1b=fDFaces*(z2-z1)/fWidth+x1;
382 //z1b=fDFaces*(x2-x1)/fWidth+z1;
383 //x2b=fDFaces*(z2-z1)/fWidth+x2;
384 //z2b=fDFaces*(x2-x1)/fWidth+z2;
385
386 x1b=x1; z1b=z1; x2b=x2; z2b=z2;
387 //x1b=x2; z1b=z1; x2b=x1; z2b=z2;
388 fn_vRenderWall(sides[lines[i].sidenum[1]].midtexture,xOffset,yOffset,fCeilingHeight1,fFloorHeight1,x1b,y1,z1b,x2b,y2,z2b,fWallWidth,(char)0x80,fLightLevel,lines[i].flags);
389 }
390 }
391 }
392
393 if (sides[lines[i].sidenum[1]].bottomtexture!=R_TextureNumForName("-"))
394 {
395 y2=fFloorHeight1;
396 y1=fFloorHeight0;
397
398 if (!bDrawWallBot)
399 fn_vRenderWall(sides[lines[i].sidenum[1]].bottomtexture,xOffset,yOffset,fCeilingHeight1,fFloorHeight1,x1,y1,z1,x2,y2,z2,fWallWidth,0x82,fLightLevel,lines[i].flags);
400 else // back-face
401 { //float fDFaces=0.5f/(MAP_SCALE>>FRACBITS); // Distance between 2 faces...
402 /* float fDFaces=1.0f/(MAP_SCALE>>FRACBITS); */ // Distance between 2 faces...
403 float x1b,z1b,x2b,z2b/*,fWidth*/;
404
405 //fWidth=fWallWidth/(MAP_SCALE>>FRACBITS);
406 // DOOM_GL
407 /* x1b=fDFaces*(z2-z1)/fWidth+x1;
408 z1b=-fDFaces*(x2-x1)/fWidth+z1;
409 x2b=fDFaces*(z2-z1)/fWidth+x2;
410 z2b=-fDFaces*(x2-x1)/fWidth+z2;*/
411 ////fn_vRenderWall(sides[lines[i].sidenum[1]].bottomtexture,xOffset,yOffset,fCeilingHeight1,fFloorHeight1,x1b,y1,z1b,x2b,y2,z2b,fWallWidth,2,fLightLevel,lines[i].flags);
412 x1b=x1; z1b=z1; x2b=x2; z2b=z2;
413 fn_vRenderWall(sides[lines[i].sidenum[1]].bottomtexture,xOffset,yOffset,fCeilingHeight1,fFloorHeight1,x1b,y1,z1b,x2b,y2,z2b,fWallWidth,(char)0x82,fLightLevel,lines[i].flags);
414 }
415 }
416
417 if (sides[lines[i].sidenum[1]].toptexture!=R_TextureNumForName("-"))
418 {
419 y1=fCeilingHeight1;
420 y2=fCeilingHeight0;
421
422 if (!bDrawWallUp)
423 fn_vRenderWall(sides[lines[i].sidenum[1]].toptexture,xOffset,yOffset,fCeilingHeight1,fFloorHeight1,x1,y1,z1,x2,y2,z2,fWallWidth,0x81,fLightLevel,lines[i].flags);
424 else // back-face
425 { //float fDFaces=0.5f/(MAP_SCALE>>FRACBITS); // Distance between 2 faces...
426 /* float fDFaces=1.0f/(MAP_SCALE>>FRACBITS); */ // Distance between 2 faces...
427 float x1b,z1b,x2b,z2b/*,fWidth*/;
428
429 //fWidth=fWallWidth/(MAP_SCALE>>FRACBITS);
430 // DOOM_GL
431 /* x1b=fDFaces*(z2-z1)/fWidth+x1;
432 z1b=-fDFaces*(x2-x1)/fWidth+z1;
433 x2b=fDFaces*(z2-z1)/fWidth+x2;
434 z2b=-fDFaces*(x2-x1)/fWidth+z2;*/
435 x1b=x1; z1b=z1; x2b=x2; z2b=z2;
436 ////fn_vRenderWall(sides[lines[i].sidenum[1]].toptexture,xOffset,yOffset,fCeilingHeight1,fFloorHeight1,x1b,y1,z1b,x2b,y2,z2b,fWallWidth,1,fLightLevel,lines[i].flags);
437 fn_vRenderWall(sides[lines[i].sidenum[1]].toptexture,xOffset,yOffset,fCeilingHeight1,fFloorHeight1,x1b,y1,z1b,x2b,y2,z2b,fWallWidth,(char)0x81,fLightLevel,lines[i].flags);
438 }
439 }
440 }
441
442 #ifndef WALL_ARRAY
443 (*glEnd_s) List();
444 #endif
445 }
446
fn_vCreateWalls()447 void fn_vCreateWalls()
448 { int i;
449
450 // GL_fn_vInitLights();
451 fn_vComputeLightLevels();
452
453 #ifndef WALL_ARRAY
454 iWall=(int *)Malloc(sizeof(int)*numlines);
455 #else
456 a_stWallPoly=(GLWallPolygonArray *)Malloc(sizeof(GLWallPolygonArray)*numlines);
457 for (i=0;i<numlines;i++)
458 a_stWallPoly[i].iNbQuads=0;
459 #endif
460 a_iGlDrawLine=(int *)Malloc(sizeof(int)*numlines);
461
462 #ifndef WALL_ARRAY
463 startWallList = glGenLists(numlines);
464 #endif
465 for (i=0;i<numlines;i++)
466 {
467 //if (i==87)
468 //if (i==793)
469 //if (i==705)
470 //if (i==472)
471 //if (i==91)
472 // printf("pouet");
473
474 fn_vCreateWallsPolygons(i);
475 }
476 }
477
478 #ifdef WALL_ARRAY
479 extern long g_bDynLight;
480
fn_vDisplayWall(int line)481 void fn_vDisplayWall(int line)
482 { GLfloat fLightLevel;
483 int iGLTex,iSubTex=0,i;
484 float fU2,fV2,fU1Off,fV1Off;
485 float x1,y1,z1,x2,y2,z2;
486 float fFloor,fCeil;
487 H_boolean bDynLight;
488
489 if (line==-1)
490 return;
491
492 /* if (line==1859)
493 printf("prout");*/
494 for (i=0;i<a_stWallPoly[line].iNbQuads;i++)
495 {
496 // MR0207
497 //fLightLevel=(float)(a_stWallPoly[line].p_stWallQuad[i].pSector->lightlevel-iLightLevelMin)/(float)(iLightLevelMax-iLightLevelMin);
498 //fLightLevel=(float)a_stWallPoly[line].p_stWallQuad[i].pSector->lightlevel/255.0f;
499 //fLightLevel=(float)(a_stWallPoly[line].p_stWallQuad[i].pSector->lightlevel-iLightLevelMin/2)/255.0f;
500 //fLightLevel=(1.0f+0.25f*(float)usegamma)*((float)a_stWallPoly[line].p_stWallQuad[i].pSector->lightlevel-0.5f)/512.0f; // MR0706
501 fLightLevel=(1.0f+0.25f*(float)usegamma)*((float)(a_stWallPoly[line].p_stWallQuad[i].pSector->lightlevel+(extralight<<LIGHTSEGSHIFT))-0.5f)/512.0f; // MR0706
502 //fLightLevel=(1.0f+0.25f*(float)usegamma)*(float)(a_stWallPoly[line].p_stWallQuad[i].pSector->lightlevel-iLightLevelMin)/(float)(iLightLevelMax-iLightLevelMin);
503
504 x1=a_stWallPoly[line].p_stWallQuad[i].a_fVertex[0];
505 y1=a_stWallPoly[line].p_stWallQuad[i].a_fVertex[1];
506 z1=a_stWallPoly[line].p_stWallQuad[i].a_fVertex[2];
507 x2=a_stWallPoly[line].p_stWallQuad[i].a_fVertex[3];
508 y2=a_stWallPoly[line].p_stWallQuad[i].a_fVertex[4];
509 z2=a_stWallPoly[line].p_stWallQuad[i].a_fVertex[5];
510 fU1Off=a_stWallPoly[line].p_stWallQuad[i].a_fUV[0];
511 fV1Off=a_stWallPoly[line].p_stWallQuad[i].a_fUV[1];
512 fU2=a_stWallPoly[line].p_stWallQuad[i].a_fUV[2];
513 fV2=a_stWallPoly[line].p_stWallQuad[i].a_fUV[3];
514 iGLTex=a_iGLTexTranslation[a_stWallPoly[line].p_stWallQuad[i].iTex];
515
516 /* sector == 1 wall !*/
517 /* if ((line>=23) && (line<=28)) { */
518 /* if ((line>=5) && (line<=9)) { */
519 /* if (a_iGLTexTranslation[a_stWallPoly[line].p_stWallQuad[i].iTex]==5) { */
520
521 /* fprintf(stderr, "!!!!!!!!! painting wall: iLineID: %d !!!!!!!!!\n", line); */
522 /* fprintf(stderr, "v1[%.4f, %.4f, %.4f], v2[%.4f, %.4f, %.4f], fU1Off: %.4f, fV1Off: %.4f, fU2: %.4f, fV2: %.4f, iGLTex: %d\n", x1, y1, z1, x2, y2, z2, fU1Off, fV1Off, fU2, fV2, iGLTex); */
523
524
525 (*glBindTexture_s) (GL_TEXTURE_2D, texobjs[iGLTex]);
526 #ifdef BILINEAR
527
528 if (p_stGLTextures[iGLTex].a_stSubTex[iSubTex].bIsNZ)
529 { float fTexHeight;
530
531 (*glEnable_s) (GL_ALPHA_TEST);
532 // MR3006: il faudrait trier ces faces....
533 /*
534 (*glAlphaFunc_s) (GL_NOTEQUAL,0.0f);
535 (*glEnable_s) (GL_BLEND);
536 (*glBlendFunc_s) (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
537 */
538
539 //(*glAlphaFunc_s) (GL_EQUAL,1.0f);
540 (*glAlphaFunc_s) (GL_NOTEQUAL,0.0f); // MR1807
541 (*glTexParameterf_s) (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
542 (*glTexParameterf_s) (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
543
544 /* ANDRE !!! */
545 //(*glDisable_s) (GL_CULL_FACE); // DOOM_GL
546 // MR1806: pour DoomGL E1M3 au d�but de la map...
547 fTexHeight=(float)p_stGLTextures[iGLTex].a_stSubTex[0].iHeight/(float)MAP_COEFF;
548 if ((y1-y2)>fTexHeight)
549 { if (lines[line].flags & ML_DONTPEGBOTTOM)
550 y1=y2+fTexHeight;
551 else
552 y2=y1-fTexHeight;
553 fV1Off=0.0f; fV2=1.0f;
554 }
555 /*if (lines[line].flags & ML_DONTPEGBOTTOM) // MR2506
556 { fV1Off=1.0f-fV2;
557 fV2=1.0f;
558 }*/
559 bDynLight=g_bDynLight!=0?1:0;
560 }
561 else
562 bDynLight=g_bDynLight;
563 #endif
564 // if (y1 ou y2 < sol) ou (y1 ou y2 > plafond) alors trace rien ! // DOOM_GL (a voir)
565 fFloor=(float)a_stWallPoly[line].p_stWallQuad[i].pSector->floorheight/MAP_SCALE;
566 fCeil=(float)a_stWallPoly[line].p_stWallQuad[i].pSector->ceilingheight/MAP_SCALE;
567
568 /* ANDRE !!! This caused the "missing walls" problem !!!!!!!! */
569 #if 0
570 if (((a_stWallPoly[line].p_stWallQuad[i].cWallType&0x0f)==2)&&
571 (( y1 < fFloor )||
572 ( y2 < fFloor ))) {
573 /* fprintf(stderr, "iLineID: %d, y1:%.4f, y2: %.4f, fFloor: %.4f\n", line, y1, y2, fFloor); */
574 continue;
575 }
576 if (((a_stWallPoly[line].p_stWallQuad[i].cWallType&0x0f)==1)&&
577 (( y1 > fCeil )||
578 ( y2 > fCeil ))) {
579 /* fprintf(stderr, "iLineID: %d, y1:%.4f, y2: %.4f, fCeil: %.4f\n", line, y1, y2, fCeil); */
580 continue;
581 }
582 #endif
583
584 if (bDynLight==1)
585 {
586 if (a_stWallPoly[line].p_stWallQuad[i].cWallType&0x80) // it is a back-face
587 {
588 /* fprintf(stderr, "dynlight - backface !\n"); */
589 (*glBegin_s) (GL_QUADS);
590 GL_DynamicLight4f(x1, y1, z1,fLightLevel,1.0f);
591 (*glTexCoord2f_s) (fU2, fV1Off); (*glVertex3f_s) ( x1, y1, z1);
592 GL_DynamicLight4f(x2, y1, z2,fLightLevel,1.0f);
593 (*glTexCoord2f_s) (fU1Off, fV1Off); (*glVertex3f_s) ( x2, y1, z2);
594 GL_DynamicLight4f(x2, y2, z2,fLightLevel,1.0f);
595 (*glTexCoord2f_s) (fU1Off, fV2); (*glVertex3f_s) ( x2, y2, z2);
596 GL_DynamicLight4f(x1, y2, z1,fLightLevel,1.0f);
597 (*glTexCoord2f_s) (fU2, fV2); (*glVertex3f_s) ( x1, y2, z1);
598 (*glEnd_s) ();
599 }
600 else
601 {
602 /* fprintf(stderr, "dynlight - frontface !\n"); */
603 (*glBegin_s) (GL_QUADS);
604 GL_DynamicLight4f(x1, y1, z1,fLightLevel,1.0f);
605 (*glTexCoord2f_s) (fU1Off, fV1Off); (*glVertex3f_s) ( x1, y1, z1);
606 GL_DynamicLight4f(x1, y2, z1,fLightLevel,1.0f);
607 (*glTexCoord2f_s) (fU1Off, fV2); (*glVertex3f_s) ( x1, y2, z1);
608 GL_DynamicLight4f(x2, y2, z2,fLightLevel,1.0f);
609 (*glTexCoord2f_s) (fU2, fV2); (*glVertex3f_s) ( x2, y2, z2);
610 GL_DynamicLight4f(x2, y1, z2,fLightLevel,1.0f);
611 (*glTexCoord2f_s) (fU2, fV1Off); (*glVertex3f_s) ( x2, y1, z2);
612 (*glEnd_s) ();
613 }
614 }
615 else
616 {
617 GL_StaticLight3f(fLightLevel,fLightLevel,fLightLevel);
618 if (a_stWallPoly[line].p_stWallQuad[i].cWallType&0x80) // it is a back-face
619 {
620 /* fprintf(stderr, "staticlight - backface !\n"); */
621 /* fprintf(stderr, "paint wall(bf): 1[%.4f, %.4f, %.4f], 2[%.4f, %.4f, %.4f]\n",
622 x1, y1, z1, x2, y1, z2); */
623 /* fprintf(stderr, "paint wall(bf): 3[%.4f, %.4f, %.4f], 4[%.4f, %.4f, %.4f]\n\n",
624 x2, y2, z2, x1, y2, z1); */
625 (*glBegin_s) (GL_QUADS);
626 (*glTexCoord2f_s) (fU2, fV1Off); (*glVertex3f_s) ( x1, y1, z1);
627 (*glTexCoord2f_s) (fU1Off, fV1Off); (*glVertex3f_s) ( x2, y1, z2);
628 (*glTexCoord2f_s) (fU1Off, fV2); (*glVertex3f_s) ( x2, y2, z2);
629 (*glTexCoord2f_s) (fU2, fV2); (*glVertex3f_s) ( x1, y2, z1);
630 (*glEnd_s) ();
631 if (bDynLight==2)
632 GL_DrawLightsOnPolygon(x1,z1,y1,x2,z2,y2,true);
633 }
634 else
635 {
636 /* fprintf(stderr, "staticlight - frontface !\n"); */
637 /* fprintf(stderr, "paint wall(ff): 1[%.4f, %.4f, %.4f], 2[%.4f, %.4f, %.4f]\n",
638 x1, y1, z1, x1, y2, z1); */
639 /* fprintf(stderr, "paint wall(ff): 3[%.4f, %.4f, %.4f], 4[%.4f, %.4f, %.4f]\n\n",
640 x2, y2, z2, x2, y1, z2); */
641 (*glBegin_s) (GL_QUADS);
642 (*glTexCoord2f_s) (fU1Off, fV1Off); (*glVertex3f_s) ( x1, y1, z1);
643 (*glTexCoord2f_s) (fU1Off, fV2); (*glVertex3f_s) ( x1, y2, z1);
644 (*glTexCoord2f_s) (fU2, fV2); (*glVertex3f_s) ( x2, y2, z2);
645 (*glTexCoord2f_s) (fU2, fV1Off); (*glVertex3f_s) ( x2, y1, z2);
646 (*glEnd_s) ();
647 if (bDynLight==2)
648 GL_DrawLightsOnPolygon(x1,z1,y1,x2,z2,y2,false);
649 }
650 }
651 #ifdef BILINEAR
652 if (p_stGLTextures[iGLTex].a_stSubTex[iSubTex].bIsNZ)
653 {
654 (*glDisable_s) (GL_ALPHA_TEST);
655 // MR3006
656 //(*glDisable_s) (GL_BLEND);
657 (*glTexParameterf_s) (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
658 (*glTexParameterf_s) (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
659 }
660 #endif
661 /* } */
662 }
663
664 // Wall impacts
665 GL_vDrawWallImpacts(line);
666 }
667
fn_vUpdateWall(int iLineId,int iQuad,int iGLTex,short yOffset,float fCeilingHeight,float fFloorHeight,float y1,float y2,char cWallType,short flags)668 void fn_vUpdateWall(int iLineId,int iQuad,int iGLTex,short yOffset,float fCeilingHeight,float fFloorHeight,float y1,float y2,char cWallType,short flags)
669 // CWallType&0x80 ==1 => back-face
670 // CWallType&0x0F ==0 => MidTex
671 // CWallType&0x0F ==1 => TopTex
672 // CWallType&0x0F ==2 => BotTex
673 {
674 float fV1,fV2,fV1Off;
675 int iSubTex=0;
676 float yMove;
677 int i;
678
679 if (yOffset>=p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight)
680 yOffset=0;
681
682 fV1Off=(float)(p_stGLTextures[iGLTex].a_stSubTex[0].iV+yOffset)/(float)p_stGLTextures[iGLTex].iHeight;
683
684 if (((cWallType&0x0f)==2)&&(flags & ML_DONTPEGBOTTOM))
685 {
686 fV1=fV1Off;
687 fV1Off=fV1+(float)(fabs(fCeilingHeight-y1)*(MAP_SCALE>>FRACBITS))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
688 fV2=fV1+(float)(fabs(fCeilingHeight-fFloorHeight)*(MAP_SCALE>>FRACBITS))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
689 }
690 else
691 if ((((cWallType&0x0f)==0)&&(flags & ML_DONTPEGBOTTOM)&&(!(flags & ML_DONTPEGTOP)))||
692 (((cWallType&0x0f)==1)&&(!(flags & ML_DONTPEGTOP))))
693 { fV2=fV1Off;
694 fV1Off=fV2-((float)(fabs(y2-y1)*(MAP_SCALE>>FRACBITS)))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
695 }
696 else
697 fV2=fV1Off+((float)(fabs(y2-y1)*(MAP_SCALE>>FRACBITS)))/p_stGLTextures[iGLTex].a_stSubTex[iSubTex].iHeight;
698
699 // Impacts
700 if ((!iQuad)&&lines[iLineId].backsector&&(lines[iLineId].backsector->iSectorID==g_iMovingSector))
701 { if (a_stWallPoly[iLineId].p_stWallQuad[iQuad].a_fVertex[4]!=y2)
702 yMove=a_stWallPoly[iLineId].p_stWallQuad[iQuad].a_fVertex[4]-y2;
703 else
704 yMove=a_stWallPoly[iLineId].p_stWallQuad[iQuad].a_fVertex[1]-y1;
705 for (i=0;i<g_a_stWallImpacts[iLineId].iNbImpacts;i++)
706 { g_a_stWallImpacts[iLineId].y1[i]-=yMove;
707 g_a_stWallImpacts[iLineId].y2[i]-=yMove;
708 }
709 }
710 a_stWallPoly[iLineId].p_stWallQuad[iQuad].a_fVertex[1]=y1;
711 a_stWallPoly[iLineId].p_stWallQuad[iQuad].a_fVertex[4]=y2;
712 a_stWallPoly[iLineId].p_stWallQuad[iQuad].a_fUV[1]=fV1Off;
713 a_stWallPoly[iLineId].p_stWallQuad[iQuad].a_fUV[3]=fV2;
714 }
715
716 #ifndef GL_HEXEN
fn_vUpdateWallTexture(int iLine,int iWallType,int iSwitch)717 void fn_vUpdateWallTexture(int iLine,int iWallType,int iSwitch)
718 #else
719 void fn_vUpdateSwitchTexture(int iLine,int iWallType,int iSwitch)
720 #endif
721 { int i;
722
723 for (i=0;i<a_stWallPoly[iLine].iNbQuads;i++)
724 if (a_stWallPoly[iLine].p_stWallQuad[i].cWallType==iWallType)
725 { a_stWallPoly[iLine].p_stWallQuad[i].iTex=glSwitchList[iSwitch];
726 return;
727 }
728 }
729
730 #ifdef GL_HEXEN
fn_vUpdateWallTexture(int iLine,int iWallType,int iTex)731 void fn_vUpdateWallTexture(int iLine,int iWallType,int iTex)
732 { int i;
733
734 for (i=0;i<a_stWallPoly[iLine].iNbQuads;i++)
735 if (a_stWallPoly[iLine].p_stWallQuad[i].cWallType==iWallType)
736 { a_stWallPoly[iLine].p_stWallQuad[i].iTex=iTex;
737 return;
738 }
739 // MR2007: wall does not exist...
740 fn_vCreateWallsPolygons(iLine);
741 }
742
fn_vUpdateWallsTexturesFromSavedGame()743 void fn_vUpdateWallsTexturesFromSavedGame()
744 { int i,iLine;
745 int side;
746
747 //for (i=0;i<a_stWallPoly[iLine].iNbQuads;i++)
748 for (iLine=0;iLine<numlines;iLine++)
749 {
750 for (i=0;i<a_stWallPoly[iLine].iNbQuads;i++)
751 {
752 if (a_stWallPoly[iLine].p_stWallQuad[i].cWallType&0x80)
753 side=1;
754 else
755 side=0;
756 if ((a_stWallPoly[iLine].p_stWallQuad[i].cWallType&0x0F)==0)
757 a_stWallPoly[iLine].p_stWallQuad[i].iTex=GL_vRegisterWallTextureOnTheFly(sides[lines[iLine].sidenum[side]].midtexture);
758 else if ((a_stWallPoly[iLine].p_stWallQuad[i].cWallType&0x0F)==1)
759 a_stWallPoly[iLine].p_stWallQuad[i].iTex=GL_vRegisterWallTextureOnTheFly(sides[lines[iLine].sidenum[side]].toptexture);
760 else if ((a_stWallPoly[iLine].p_stWallQuad[i].cWallType&0x0F)==2)
761 a_stWallPoly[iLine].p_stWallQuad[i].iTex=GL_vRegisterWallTextureOnTheFly(sides[lines[iLine].sidenum[side]].bottomtexture);
762 }
763 }
764 }
765 #endif
766
fn_vScrollWallTexture(int iLine,int xOffset)767 void fn_vScrollWallTexture(int iLine,int xOffset)
768 { int i,iGLTexIndex;
769
770 for (i=0;i<a_stWallPoly[iLine].iNbQuads;i++)
771 {
772 iGLTexIndex=a_stWallPoly[iLine].p_stWallQuad[i].iTex;
773
774 xOffset=(xOffset>>FRACBITS);
775 /*if (xOffset>=p_stGLTextures[iGLTexIndex].a_stSubTex[0].iWidth)
776 xOffset=0;*/
777
778 a_stWallPoly[iLine].p_stWallQuad[i].a_fUV[0]=(float)(p_stGLTextures[iGLTexIndex].a_stSubTex[0].iU+xOffset)/(float)p_stGLTextures[iGLTexIndex].iWidth;
779 a_stWallPoly[iLine].p_stWallQuad[i].a_fUV[2]=a_stWallPoly[iLine].p_stWallQuad[i].a_fUV[0]+(float)a_stWallPoly[iLine].fWallWidth/p_stGLTextures[iGLTexIndex].iWidth;
780 }
781 }
782
783 #ifdef GL_HEXEN
fn_vScrollWallTextureV(int iLine,int yOffset)784 void fn_vScrollWallTextureV(int iLine,int yOffset)
785 { int i,iGLTexIndex;
786 float fV1Off,fV2,y1,y2;
787 short flags;
788 char cWallType;
789
790 flags=lines[iLine].flags;
791 for (i=0;i<a_stWallPoly[iLine].iNbQuads;i++)
792 {
793 iGLTexIndex=a_stWallPoly[iLine].p_stWallQuad[i].iTex;
794 y1=a_stWallPoly[iLine].p_stWallQuad[i].a_fVertex[1];
795 y2=a_stWallPoly[iLine].p_stWallQuad[i].a_fVertex[4];
796 cWallType=a_stWallPoly[iLine].p_stWallQuad[i].cWallType;
797
798 yOffset=(yOffset>>FRACBITS);
799 fV1Off=(float)(p_stGLTextures[iGLTexIndex].a_stSubTex[0].iV+yOffset)/(float)p_stGLTextures[iGLTexIndex].iHeight;
800 /* if (((cWallType&0x0f)==2)&&(flags & ML_DONTPEGBOTTOM))
801 {
802 fV1Off=fV1+(float)(fabs(fCeilingHeight-y1)*(MAP_SCALE>>FRACBITS))/p_stGLTextures[iGLTex].a_stSubTex[0].iHeight;
803 fV2=fV1+(float)(fabs(fCeilingHeight-fFloorHeight)*(MAP_SCALE>>FRACBITS))/p_stGLTextures[iGLTex].a_stSubTex[0].iHeight;
804 }
805 else*/
806 if ((((cWallType&0x0f)==0)&&(flags & ML_DONTPEGBOTTOM)&&(!(flags & ML_DONTPEGTOP)))||
807 (((cWallType&0x0f)==1)&&(!(flags & ML_DONTPEGTOP))))
808 { fV2=fV1Off;
809 fV1Off=fV2-((float)(fabs(y2-y1)*(MAP_SCALE>>FRACBITS)))/p_stGLTextures[iGLTexIndex].a_stSubTex[0].iHeight;
810 }
811 else
812 fV2=fV1Off+((float)(fabs(y2-y1)*(MAP_SCALE>>FRACBITS)))/p_stGLTextures[iGLTexIndex].a_stSubTex[0].iHeight;
813
814
815 a_stWallPoly[iLine].p_stWallQuad[i].a_fUV[1]=fV1Off;
816 a_stWallPoly[iLine].p_stWallQuad[i].a_fUV[3]=fV2;
817 }
818 }
819 #endif // GL_HEXEN
820
fn_vUpdateWallsPolygons(int i)821 void fn_vUpdateWallsPolygons(int i)
822 {
823 float y1=0.0f, y2=0.0f;
824 short yOffset;
825 float fCeilingHeight0, fFloorHeight0, fCeilingHeight1=0.0f, fFloorHeight1=0.0f;
826 int j;
827
828 if (i==-1) // DOOM_GL
829 return;
830
831 yOffset=sides[lines[i].sidenum[0]].rowoffset>>FRACBITS;
832
833 pCurrentSector=sides[lines[i].sidenum[0]].sector;
834
835 fCeilingHeight0=(float)lines[i].frontsector->ceilingheight/MAP_SCALE;
836 fFloorHeight0=(float)lines[i].frontsector->floorheight/MAP_SCALE;
837 if (lines[i].backsector)
838 { fCeilingHeight1=(float)lines[i].backsector->ceilingheight/MAP_SCALE;
839 fFloorHeight1=(float)lines[i].backsector->floorheight/MAP_SCALE;
840 }
841
842 #ifdef GL_HEXEN // MR2007
843 if (((fCeilingHeight0!=fFloorHeight0)||(fCeilingHeight1!=fFloorHeight1))&&
844 (a_stWallPoly[i].iNbQuads==0))
845 { fn_vCreateWallsPolygons(i);
846 return;
847 }
848 #endif
849 for (j=0;j<a_stWallPoly[i].iNbQuads;j++)
850 { //if (lines[i].frontsector==a_stWallPoly[i].p_stWallQuad[j].pSector)
851 if (!(a_stWallPoly[i].p_stWallQuad[j].cWallType&0x80)) // DOOM_GL
852 { switch((a_stWallPoly[i].p_stWallQuad[j].cWallType&0x0f))
853 { case 0: // Mid
854 if (lines[i].backsector)
855 { y1=fCeilingHeight1;
856 y2=fFloorHeight1;
857 }
858 else
859 { y1=fCeilingHeight0;
860 y2=fFloorHeight0;
861 }
862 break;
863 case 1: // Top
864 y1=fCeilingHeight0;
865 y2=fCeilingHeight1;
866 break;
867 case 2: // Bot
868 y2=fFloorHeight0;
869 y1=fFloorHeight1;
870 }
871
872 fn_vUpdateWall(i,j,a_stWallPoly[i].p_stWallQuad[j].iTex,yOffset,fCeilingHeight0,fFloorHeight0,y1,y2,a_stWallPoly[i].p_stWallQuad[j].cWallType,lines[i].flags);
873 }
874 else // back-faces...
875 {
876 yOffset=sides[lines[i].sidenum[1]].rowoffset>>FRACBITS;
877
878 switch(a_stWallPoly[i].p_stWallQuad[j].cWallType&0x0f)
879 { case 0:
880 /*y1=fCeilingHeight0;
881 y2=fFloorHeight0;*/
882 y1=fCeilingHeight1;
883 y2=fFloorHeight1;
884 break;
885 case 1:
886 y1=fCeilingHeight1;
887 y2=fCeilingHeight0;
888 break;
889 case 2:
890 y2=fFloorHeight1;
891 y1=fFloorHeight0;
892 }
893
894 fn_vUpdateWall(i,j,a_stWallPoly[i].p_stWallQuad[j].iTex,yOffset,fCeilingHeight1,fFloorHeight1,y1,y2,a_stWallPoly[i].p_stWallQuad[j].cWallType,lines[i].flags);
895 }
896 }
897 }
898
GL_vAddWallsForWaggle(sector_t * sector)899 void GL_vAddWallsForWaggle(sector_t *sector)
900 { int i,j,iLineID,back;
901
902 for (i=0;i<sector->linecount;i++)
903 { iLineID=sector->lines[i]->iLineID;
904 if (sector->lines[i]->flags&ML_TWOSIDED)
905 { if (sector->lines[i]->frontsector==sector)
906 { if (sides[lines[iLineID].sidenum[0]].bottomtexture==R_TextureNumForName("-"))
907 sides[lines[iLineID].sidenum[0]].bottomtexture=R_TextureNumForName("BOOKS01");
908 else
909 continue;
910 back=0;
911 }
912 else
913 if (sector->lines[i]->backsector==sector)
914 { if (sides[lines[iLineID].sidenum[1]].bottomtexture==R_TextureNumForName("-"))
915 sides[lines[iLineID].sidenum[1]].bottomtexture=R_TextureNumForName("BOOKS01");
916 else
917 continue;
918 back=1;
919 }
920
921 fn_vCreateWallsPolygons(iLineID);
922 for (j=0;j<a_stWallPoly[iLineID].iNbQuads;j++)
923 a_stWallPoly[iLineID].p_stWallQuad[j].iTex=fn_iGetGLFlatTexturef(sector->floorpic);
924 //if (back)
925 // sides[lines[iLineID].sidenum[1]].bottomtexture=R_TextureNumForName("-");
926 //else
927 // sides[lines[iLineID].sidenum[0]].bottomtexture=R_TextureNumForName("-");
928 }
929 }
930 }
931
GL_vUpdateWallsForWaggle(sector_t * sector)932 void GL_vUpdateWallsForWaggle(sector_t *sector)
933 { int i,j,iLineID/*,back*/;
934
935 for (i=0;i<sector->linecount;i++)
936 { iLineID=sector->lines[i]->iLineID;
937 if (sector->lines[i]->flags&ML_TWOSIDED)
938 { if (((sector->lines[i]->frontsector==sector)&&
939 (sides[lines[iLineID].sidenum[0]].bottomtexture==R_TextureNumForName("BOOKS01")))
940 ||
941 ((sector->lines[i]->backsector==sector)&&
942 (sides[lines[iLineID].sidenum[1]].bottomtexture==R_TextureNumForName("BOOKS01"))))
943 {
944 if (a_stWallPoly[iLineID].iNbQuads==2)
945 continue;
946 fn_vCreateWallsPolygons(iLineID);
947 for (j=0;j<a_stWallPoly[iLineID].iNbQuads;j++)
948 a_stWallPoly[iLineID].p_stWallQuad[j].iTex=fn_iGetGLFlatTexturef(sector->floorpic);
949 }
950 }
951 }
952 }
953 #endif // WALL_ARRAY
954
955 /*void fn_vRemoveBadWalls() // DOOM_GL
956 { int i;
957 line_t *ld;
958
959 ld = lines;
960 for (i=0 ; i<numlines ; i++,ld++)
961 {
962 if ((ld->frontsector->ceilingpic==R_FlatNumForName("F_SKY1"))&&
963 (sides[ld->sidenum[0]].toptexture!=R_TextureNumForName("-"))&&
964 ld->backsector&&
965 (ld->backsector->ceilingpic==R_FlatNumForName("F_SKY1"))) // DOOM_GL (cf E1M1 line 251)
966 ld->iLineID=-1;
967 }
968 }*/
969
970 // Wall impacts
971 unsigned char *g_p_bImpactTexture[7];
972 int g_iImpact;
973 float g_fThingX,g_fThingY,g_fThingZ;
974 int g_iThingDamage;
975
fn_vLoadImpactRAWFile(char * szFileName,unsigned char * Texture,int width,int height,unsigned char transp)976 void fn_vLoadImpactRAWFile(char *szFileName,unsigned char *Texture,int width,int height,unsigned char transp)
977 { int hFile;
978 unsigned char *buffer;
979 int x,y;
980
981 buffer=(unsigned char *)malloc(width*height*3);
982 if ((hFile=wadopen(szFileName)) == -1)
983 I_Error("Could not open file %s\n",szFileName);
984
985 read(hFile, buffer, width*height*3);
986 close(hFile);
987 for (x=0;x<width;x++)
988 for (y=0;y<height;y++)
989 { if (((buffer[3*(y*width+x)]==transp)&&
990 (buffer[3*(y*width+x)+1]==transp)&&
991 (buffer[3*(y*width+x)+2]==transp))/*||
992 ((buffer[3*(y*width+x)]==0)&&
993 (buffer[3*(y*width+x)+1]==0)&&
994 (buffer[3*(y*width+x)+2]==0))*/)
995 {
996 Texture[4*(y*width+x)]=0;
997 Texture[4*(y*width+x)+1]=0;
998 Texture[4*(y*width+x)+2]=0;
999 Texture[4*(y*width+x)+3]=0;
1000 }
1001 else
1002 {
1003 Texture[4*(y*width+x)]=buffer[3*(y*width+x)];
1004 Texture[4*(y*width+x)+1]=buffer[3*(y*width+x)+1];
1005 Texture[4*(y*width+x)+2]=buffer[3*(y*width+x)+2];
1006 if (!transp)
1007 {
1008 int iAlpha;
1009
1010 //iAlpha=(int)(buffer[3*(y*width+x)]*3);
1011 iAlpha=(int)(buffer[3*(y*width+x)]*2);
1012 if (iAlpha<100)
1013 iAlpha=0;
1014 if (iAlpha>255)
1015 iAlpha=255;
1016 Texture[4*(y*width+x)+3]=(unsigned char)iAlpha;
1017 }
1018 else
1019 { //Texture[4*(y*width+x)+3]=255;
1020 int iAlpha;
1021 #ifndef DOOM_GL
1022 iAlpha=255-(int)(buffer[3*(y*width+x)])*2;
1023 if (iAlpha<0)
1024 iAlpha=0;
1025 #else
1026 iAlpha=255-(int)(buffer[3*(y*width+x)]);
1027 #endif
1028 if (iAlpha>255)
1029 iAlpha=255;
1030 Texture[4*(y*width+x)+3]=(unsigned char)iAlpha;
1031 }
1032 }
1033 }
1034 free(buffer);
1035 }
1036
GL_LoadImpactTextures()1037 void GL_LoadImpactTextures()
1038 { /* int x,y; */
1039
1040 //g_p_bImpactTexture[0]=(unsigned char *)Malloc(64*64*4);
1041
1042 //fn_vLoadImpactRAWFile("bullet1.raw",g_p_bImpactTexture[0],64,64,255);
1043 g_p_bImpactTexture[0]=(unsigned char *)Malloc(32*32*4);
1044
1045 fn_vLoadImpactRAWFile("bullet1.raw",g_p_bImpactTexture[0],32,32,255);
1046
1047 g_p_bImpactTexture[1]=(unsigned char *)Malloc(64*64*4);
1048 fn_vLoadImpactRAWFile("blood1.raw",g_p_bImpactTexture[1],64,64,0);
1049 g_p_bImpactTexture[2]=(unsigned char *)Malloc(64*64*4);
1050 fn_vLoadImpactRAWFile("blood2.raw",g_p_bImpactTexture[2],64,64,0);
1051 g_p_bImpactTexture[3]=(unsigned char *)Malloc(32*32*4);
1052 fn_vLoadImpactRAWFile("blood3.raw",g_p_bImpactTexture[3],32,32,0);
1053 g_p_bImpactTexture[4]=(unsigned char *)Malloc(32*32*4);
1054 fn_vLoadImpactRAWFile("blood4.raw",g_p_bImpactTexture[4],32,32,0);
1055 g_p_bImpactTexture[5]=(unsigned char *)Malloc(32*32*4);
1056 fn_vLoadImpactRAWFile("blood5.raw",g_p_bImpactTexture[5],32,32,0);
1057 //g_p_bImpactTexture[6]=(unsigned char *)Malloc(64*32*4);
1058 //fn_vLoadImpactRAWFile("blood6.raw",g_p_bImpactTexture[6],64,32,0);
1059 g_p_bImpactTexture[6]=(unsigned char *)Malloc(32*32*4);
1060 fn_vLoadImpactRAWFile("blood6.raw",g_p_bImpactTexture[6],32,32,0);
1061 }
1062
fn_vAddImpact(int line,float xA,float yA,float xB,float yB,float z,float d,char type)1063 void fn_vAddImpact(int line,float xA,float yA,float xB,float yB,float z,float d,char type)
1064 { int iNbImpacts;
1065
1066 if (g_a_stWallImpacts[line].iNbImpacts>=g_iMaxImpacts)
1067 return;
1068
1069 iNbImpacts=g_a_stWallImpacts[line].iNbImpacts;
1070 if (iNbImpacts==0)
1071 {
1072 g_a_stWallImpacts[line].x1=(float *)Malloc(sizeof(float));
1073 g_a_stWallImpacts[line].y1=(float *)Malloc(sizeof(float));
1074 g_a_stWallImpacts[line].z1=(float *)Malloc(sizeof(float));
1075 g_a_stWallImpacts[line].x2=(float *)Malloc(sizeof(float));
1076 g_a_stWallImpacts[line].y2=(float *)Malloc(sizeof(float));
1077 g_a_stWallImpacts[line].z2=(float *)Malloc(sizeof(float));
1078 g_a_stWallImpacts[line].type=(char *)Malloc(1);
1079 }
1080 else
1081 {
1082 g_a_stWallImpacts[line].x1=(float *)Realloc(g_a_stWallImpacts[line].x1,(iNbImpacts+1)*sizeof(float));
1083 g_a_stWallImpacts[line].y1=(float *)Realloc(g_a_stWallImpacts[line].y1,(iNbImpacts+1)*sizeof(float));
1084 g_a_stWallImpacts[line].z1=(float *)Realloc(g_a_stWallImpacts[line].z1,(iNbImpacts+1)*sizeof(float));
1085 g_a_stWallImpacts[line].x2=(float *)Realloc(g_a_stWallImpacts[line].x2,(iNbImpacts+1)*sizeof(float));
1086 g_a_stWallImpacts[line].y2=(float *)Realloc(g_a_stWallImpacts[line].y2,(iNbImpacts+1)*sizeof(float));
1087 g_a_stWallImpacts[line].z2=(float *)Realloc(g_a_stWallImpacts[line].z2,(iNbImpacts+1)*sizeof(float));
1088 g_a_stWallImpacts[line].type=(char *)Realloc(g_a_stWallImpacts[line].type,iNbImpacts+1);
1089 }
1090 g_a_stWallImpacts[line].x1[iNbImpacts]=xA;
1091 g_a_stWallImpacts[line].y1[iNbImpacts]=z+d;
1092 g_a_stWallImpacts[line].z1[iNbImpacts]=yA;
1093 g_a_stWallImpacts[line].x2[iNbImpacts]=xB;
1094 g_a_stWallImpacts[line].y2[iNbImpacts]=z-d;
1095 g_a_stWallImpacts[line].z2[iNbImpacts]=yB;
1096 g_a_stWallImpacts[line].type[iNbImpacts]=type;
1097
1098 g_a_stWallImpacts[line].iNbImpacts++;
1099 }
1100
GL_vGenerateWallImpact(line_t * line,float x,float y,float z,char type,float size)1101 void GL_vGenerateWallImpact(line_t *line,float x,float y,float z,char type,float size)
1102 //void GL_vGenerateWallImpact(line_t *line,double x,double y,double z,char type,float size)
1103 { float x1,y1,/*z1,*/x2,y2/*,z2*/;
1104 float a,b,A,B,C;
1105 float xA,yA,xB,yB;
1106 float d=size;
1107 /*double x1,y1,z1,x2,y2,z2;
1108 double a,b,A,B,C;
1109 double xA,yA,xB,yB;
1110 double d=size;*/
1111
1112
1113 x/=-MAP_SCALE;
1114 y/=MAP_SCALE;
1115 z/=MAP_SCALE;
1116 /*x1=-(double)line->v1->x/MAP_SCALE;
1117 y1=(double)line->v1->y/MAP_SCALE;
1118 x2=-(double)line->v2->x/MAP_SCALE;
1119 y2=(double)line->v2->y/MAP_SCALE;*/
1120 x1=-(float)line->v1->x/MAP_SCALE;
1121 y1=(float)line->v1->y/MAP_SCALE;
1122 x2=-(float)line->v2->x/MAP_SCALE;
1123 y2=(float)line->v2->y/MAP_SCALE;
1124
1125 if (x1==x2)
1126 {
1127 xA=xB=x1;
1128 yA=y-d;
1129 yB=y+d;
1130 }
1131 else
1132 if (y1==y2)
1133 {
1134 yA=yB=y1;
1135 xA=x-d;
1136 xB=x+d;
1137 }
1138 else
1139 { float u;
1140
1141 a=(y2-y1)/(x2-x1);
1142 b=y1-a*x1;
1143 //y=a*x+b;
1144 u=((x-x1)*(x2-x1)+(y-y1)*(y2-y1))/((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
1145 x=x1+u*(x2-x1);
1146 y=y1+u*(y2-y1);
1147
1148 A=1+a*a; B=2*a*b-2*a*y-2*x; C=b*b+x*x-2*b*y+y*y-d*d;
1149
1150 xA=(-B+sqrt(fabs(B*B-4*A*C)))/(2*A);
1151 xB=(-B-sqrt(fabs(B*B-4*A*C)))/(2*A);
1152 yA=a*xA+b;
1153 yB=a*xB+b;
1154 }
1155
1156 fn_vAddImpact(line->iLineID,(float)xA,(float)yA,(float)xB,(float)yB,(float)z,d,type);
1157 }
1158
GL_vDrawWallImpacts(int line)1159 void GL_vDrawWallImpacts(int line)
1160 { int i;
1161
1162 (*glDepthFunc_s) (GL_EQUAL);
1163 (*glEnable_s) (GL_ALPHA_TEST);
1164 (*glAlphaFunc_s) (GL_NOTEQUAL,0.0f);
1165 (*glEnable_s) (GL_BLEND);
1166 (*glBlendFunc_s) (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1167
1168 /* ANDRE !!! */
1169 (*glDisable_s) (GL_CULL_FACE);
1170
1171 for (i=0;i<g_a_stWallImpacts[line].iNbImpacts;i++)
1172 {
1173 (*glBindTexture_s) (GL_TEXTURE_2D, g_iImpact+g_a_stWallImpacts[line].type[i]);
1174
1175 (*glBegin_s) (GL_QUADS);
1176 (*glTexCoord2f_s) (0, 0); (*glVertex3f_s) ( g_a_stWallImpacts[line].x1[i], g_a_stWallImpacts[line].y1[i], g_a_stWallImpacts[line].z1[i]);
1177 (*glTexCoord2f_s) (0, 1); (*glVertex3f_s) ( g_a_stWallImpacts[line].x2[i], g_a_stWallImpacts[line].y1[i], g_a_stWallImpacts[line].z2[i]);
1178 (*glTexCoord2f_s) (1, 1); (*glVertex3f_s) ( g_a_stWallImpacts[line].x2[i], g_a_stWallImpacts[line].y2[i], g_a_stWallImpacts[line].z2[i]);
1179 (*glTexCoord2f_s) (1, 0); (*glVertex3f_s) ( g_a_stWallImpacts[line].x1[i], g_a_stWallImpacts[line].y2[i], g_a_stWallImpacts[line].z1[i]);
1180 (*glEnd_s) ();
1181 }
1182
1183 (*glDepthFunc_s) (GL_LESS);
1184 (*glDisable_s) (GL_ALPHA_TEST);
1185 (*glDisable_s) (GL_BLEND);
1186
1187 /* ANDRE !!! */
1188 (*glEnable_s) (GL_CULL_FACE);
1189 }
1190
1191 extern fixed_t attackrange;
1192 extern fixed_t shootz;
1193 extern fixed_t aimslope;
1194
1195
1196 H_boolean
PTR_BloodTraverse(intercept_t * in)1197 PTR_BloodTraverse (intercept_t* in)
1198 {
1199 fixed_t x;
1200 fixed_t y;
1201 fixed_t z;
1202 fixed_t frac;
1203
1204 line_t* li;
1205
1206 /* mobj_t* th; */
1207
1208 fixed_t slope;
1209 fixed_t dist;
1210 /* fixed_t thingtopslope; */
1211 /* fixed_t thingbottomslope; */
1212
1213 float fX,fY,fZ,dist2,fBloodSize;
1214
1215 if (in->isaline)
1216 {
1217 li = in->d.line;
1218
1219 if ( !(li->flags & ML_TWOSIDED) )
1220 goto hitline;
1221
1222 // crosses a two sided line
1223 P_LineOpening (li);
1224
1225 dist = FixedMul (attackrange, in->frac);
1226
1227 if (li->frontsector->floorheight != li->backsector->floorheight)
1228 {
1229 slope = FixedDiv (openbottom - shootz , dist);
1230 if (slope > aimslope)
1231 goto hitline;
1232 }
1233
1234 if (li->frontsector->ceilingheight != li->backsector->ceilingheight)
1235 {
1236 slope = FixedDiv (opentop - shootz , dist);
1237 if (slope < aimslope)
1238 goto hitline;
1239 }
1240
1241 // shot continues
1242 return true;
1243
1244
1245 // hit line
1246 hitline:
1247 // position a bit closer
1248 frac = in->frac - FixedDiv (4*FRACUNIT,attackrange);
1249 x = trace.x + FixedMul (trace.dx, frac);
1250 y = trace.y + FixedMul (trace.dy, frac);
1251 z = shootz + FixedMul (aimslope, FixedMul(frac, attackrange));
1252
1253 if (li->frontsector->ceilingpic == skyflatnum)
1254 {
1255 // don't shoot the sky!
1256 if (z > li->frontsector->ceilingheight)
1257 return false;
1258
1259 // it's a sky hack wall
1260 if (li->backsector && li->backsector->ceilingpic == skyflatnum)
1261 return false;
1262 }
1263
1264 // Blood impact...
1265 fX=-(float)x/MAP_SCALE;
1266 fY=(float)y/MAP_SCALE;
1267 fZ=(float)z/MAP_SCALE;
1268 dist2=sqrt((fX-g_fThingX)*(fX-g_fThingX)+(fY-g_fThingY)*(fY-g_fThingY)+(fZ-g_fThingZ)*(fZ-g_fThingZ));
1269 #ifdef DOOM_GL
1270 if (dist2>2.0f)
1271 #else
1272 if (dist2>1.0f)
1273 #endif
1274 return false;
1275 else
1276 { dist2+=1.0f;
1277 #ifdef DOOM_GL
1278 fBloodSize=0.2f*(float)g_iThingDamage/(15.0f*dist2);
1279 #else
1280 fBloodSize=0.1f*(float)g_iThingDamage/(15.0f*dist2);
1281 #endif
1282 //GL_vGenerateWallImpact(li,(float)x,(float)y,(float)z,(P_Random()%5)+1,fBloodSize);
1283 GL_vGenerateWallImpact(li,(float)x,(float)y,(float)z,(rand()%5)+1,fBloodSize);
1284 /*
1285 if ((z && li->backsector && z<li->backsector->floorheight)||
1286 (z && li->backsector && z>li->backsector->ceilingheight))
1287
1288 */
1289 }
1290
1291 // don't go any farther
1292 return false;
1293 }
1294
1295 return true;
1296 }
1297
1298 GLboolean g_bBloodSplash;
GL_CheckForBloodSplash(fixed_t x,fixed_t y,fixed_t z,int damage)1299 void GL_CheckForBloodSplash(fixed_t x,fixed_t y,fixed_t z,int damage)
1300 {
1301 g_bBloodSplash=true;
1302 g_fThingX=-(float)x/MAP_SCALE;
1303 g_fThingY=(float)y/MAP_SCALE;
1304 g_fThingZ=(float)z/MAP_SCALE;
1305 g_iThingDamage=damage;
1306 }
1307
GL_bBloodSplash()1308 GLboolean GL_bBloodSplash()
1309 { GLboolean ret;
1310
1311 ret=g_bBloodSplash;
1312 g_bBloodSplash=false;
1313
1314 return ret;
1315
1316 }
1317
1318 #ifndef GL_HEXEN
1319 extern byte* save_p;
GL_ArchiveWallImpacts()1320 void GL_ArchiveWallImpacts()
1321 { int *iPut;
1322 float *fPut;
1323 int i,j;
1324
1325 iPut=(int *)save_p;
1326 for (i=0;i<numlines;i++)
1327 {
1328 *iPut++=g_a_stWallImpacts[i].iNbImpacts;
1329 if (!g_a_stWallImpacts[i].iNbImpacts)
1330 { save_p=(byte *)iPut;
1331 continue;
1332 }
1333 fPut=(float *)iPut;
1334 for (j=0;j<g_a_stWallImpacts[i].iNbImpacts;j++)
1335 { *fPut++=g_a_stWallImpacts[i].x1[j];
1336 *fPut++=g_a_stWallImpacts[i].y1[j];
1337 *fPut++=g_a_stWallImpacts[i].z1[j];
1338 *fPut++=g_a_stWallImpacts[i].x2[j];
1339 *fPut++=g_a_stWallImpacts[i].y2[j];
1340 *fPut++=g_a_stWallImpacts[i].z2[j];
1341 save_p=(byte *)fPut;
1342 *save_p++=g_a_stWallImpacts[i].type[j];
1343 fPut=(float *)save_p;
1344 }
1345 iPut=(int *)save_p;
1346 }
1347 }
1348
GL_UnArchiveWallImpacts()1349 void GL_UnArchiveWallImpacts()
1350 { int *iGet;
1351 float *fGet;
1352 int i,j;
1353
1354 iGet=(int *)save_p;
1355 for (i=0;i<numlines;i++)
1356 {
1357 g_a_stWallImpacts[i].iNbImpacts=*iGet++;
1358 if (!g_a_stWallImpacts[i].iNbImpacts)
1359 { save_p=(byte *)iGet;
1360 continue;
1361 }
1362 fGet=(float *)iGet;
1363 g_a_stWallImpacts[i].x1=(float *)Malloc(g_a_stWallImpacts[i].iNbImpacts*sizeof(float));
1364 g_a_stWallImpacts[i].y1=(float *)Malloc(g_a_stWallImpacts[i].iNbImpacts*sizeof(float));
1365 g_a_stWallImpacts[i].z1=(float *)Malloc(g_a_stWallImpacts[i].iNbImpacts*sizeof(float));
1366 g_a_stWallImpacts[i].x2=(float *)Malloc(g_a_stWallImpacts[i].iNbImpacts*sizeof(float));
1367 g_a_stWallImpacts[i].y2=(float *)Malloc(g_a_stWallImpacts[i].iNbImpacts*sizeof(float));
1368 g_a_stWallImpacts[i].z2=(float *)Malloc(g_a_stWallImpacts[i].iNbImpacts*sizeof(float));
1369 g_a_stWallImpacts[i].type=(char *)Malloc(g_a_stWallImpacts[i].iNbImpacts*sizeof(char));
1370 for (j=0;j<g_a_stWallImpacts[i].iNbImpacts;j++)
1371 { g_a_stWallImpacts[i].x1[j]=*fGet++;
1372 g_a_stWallImpacts[i].y1[j]=*fGet++;
1373 g_a_stWallImpacts[i].z1[j]=*fGet++;
1374 g_a_stWallImpacts[i].x2[j]=*fGet++;
1375 g_a_stWallImpacts[i].y2[j]=*fGet++;
1376 g_a_stWallImpacts[i].z2[j]=*fGet++;
1377 save_p=(byte *)fGet;
1378 g_a_stWallImpacts[i].type[j]=*save_p++;
1379 fGet=(float *)save_p;
1380 }
1381 iGet=(int *)save_p;
1382 }
1383 }
1384 #endif
GL_InitWallImpacts(int numlines)1385 void GL_InitWallImpacts(int numlines)
1386 { int i;
1387
1388 g_a_stWallImpacts=(GLWallImpact *)Malloc(numlines*sizeof(GLWallImpact));
1389 for (i=0 ; i<numlines ; i++)
1390 {
1391 g_a_stWallImpacts[i].iNbImpacts=0;
1392 g_a_stWallImpacts[i].x1=NULL;
1393 g_a_stWallImpacts[i].y1=NULL;
1394 g_a_stWallImpacts[i].z1=NULL;
1395 g_a_stWallImpacts[i].x2=NULL;
1396 g_a_stWallImpacts[i].y2=NULL;
1397 g_a_stWallImpacts[i].z2=NULL;
1398 g_a_stWallImpacts[i].type=NULL;
1399 }
1400 }
1401 #endif // GL_HERETIC
1402