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