summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--build.zig1
-rw-r--r--src/Decals.cpp2
-rw-r--r--src/Fog.cpp53
-rw-r--r--src/Fog.h21
-rw-r--r--src/Game.h1
-rw-r--r--src/GameDraw.cpp32
-rw-r--r--src/GameInitDispose.cpp2
-rw-r--r--src/Sprites.cpp54
-rw-r--r--src/misc.h11
-rw-r--r--src/misc.zig49
10 files changed, 112 insertions, 114 deletions
diff --git a/build.zig b/build.zig
index cd0322e..5093398 100644
--- a/build.zig
+++ b/build.zig
@@ -37,7 +37,6 @@ pub fn build(b: *Builder) void {
 
     const cxxflags = [_][]const u8{ "--std=c++17", "-fno-sanitize=undefined" };
     exe.addCSourceFile("src/Decals.cpp", &cxxflags);
-    exe.addCSourceFile("src/Fog.cpp", &cxxflags);
     exe.addCSourceFile("src/Frustum.cpp", &cxxflags);
     exe.addCSourceFile("src/GameDraw.cpp", &cxxflags);
     exe.addCSourceFile("src/GameInitDispose.cpp", &cxxflags);
diff --git a/src/Decals.cpp b/src/Decals.cpp
index 1522053..8a6ab5e 100644
--- a/src/Decals.cpp
+++ b/src/Decals.cpp
@@ -3,7 +3,7 @@
 #include "Camera.h"
 #include "Constants.h"
 #include "Decals.h"
-#include "Fog.h"
+#include "misc.h"
 
 extern float multiplier;
 extern bool slomo;
diff --git a/src/Fog.cpp b/src/Fog.cpp
deleted file mode 100644
index 80e2830..0000000
--- a/src/Fog.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/**> HEADER FILES <**/
-#include "Fog.h"
-
-void Fog::SetFog(float colorR, float colorG, float colorB, float fStart, float fEnd, float Density)
-{
-	fogColor[0]=colorR;
-	fogColor[1]=colorG;
-	fogColor[2]=colorB;
-	fogColor[3]=1;
-	fogStart=fStart;
-	fogEnd=fEnd;
-	fogDensity=Density;
-	fogMode=GL_LINEAR;
-
-	glFogi(GL_FOG_MODE,fogMode);
-	glFogfv(GL_FOG_COLOR,fogColor);
-	glFogf(GL_FOG_DENSITY,fogDensity);
-	glFogi(GL_FOG_HINT,GL_DONT_CARE);
-	glFogf(GL_FOG_START,fogStart);
-	glFogf(GL_FOG_END,fogEnd);
-
-	glEnable(GL_FOG);
-}
-
-void Fog::TempFog(float colorR, float colorG, float colorB)
-{
-	GLfloat tempfogColor[4];
-	tempfogColor[0]=colorR;
-	tempfogColor[1]=colorG;
-	tempfogColor[2]=colorB;
-	tempfogColor[3]=1;
-
-	glFogi(GL_FOG_MODE,fogMode);
-	glFogfv(GL_FOG_COLOR,tempfogColor);
-	glFogf(GL_FOG_DENSITY,fogDensity);
-	glFogi(GL_FOG_HINT,GL_DONT_CARE);
-	glFogf(GL_FOG_START,fogStart);
-	glFogf(GL_FOG_END,fogEnd);
-
-	glEnable(GL_FOG);
-}
-
-void Fog::ResetFog()
-{
-	glFogi(GL_FOG_MODE,fogMode);
-	glFogfv(GL_FOG_COLOR,fogColor);
-	glFogf(GL_FOG_DENSITY,fogDensity);
-	glFogi(GL_FOG_HINT,GL_DONT_CARE);
-	glFogf(GL_FOG_START,fogStart);
-	glFogf(GL_FOG_END,fogEnd);
-
-	glEnable(GL_FOG);
-}
diff --git a/src/Fog.h b/src/Fog.h
deleted file mode 100644
index ea1f2d2..0000000
--- a/src/Fog.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef _FOG_H_
-#define _FOG_H_
-
-/**> HEADER FILES <**/
-#include <GL/gl.h>
-#include "Quaternions.h"
-
-class Fog{
-	public:
-		GLfloat fogColor[4];
-		GLint fogMode;
-		GLfloat fogDensity;
-		GLfloat fogStart;
-		GLfloat fogEnd;
-
-		void SetFog(float colorR, float colorG, float colorB, float fStart, float fEnd, float fogDensity);
-		void TempFog(float colorR, float colorG, float colorB);
-		void ResetFog();
-};
-
-#endif
diff --git a/src/Game.h b/src/Game.h
index e3fd80c..105a65e 100644
--- a/src/Game.h
+++ b/src/Game.h
@@ -42,7 +42,6 @@
 #include "Skeleton.h"
 #include "Models.h"
 #include "Text.h"
-#include "Fog.h"
 #include "Frustum.h"
 #include "Sprites.h"
 #include "Person.h"
diff --git a/src/GameDraw.cpp b/src/GameDraw.cpp
index f2d5695..f68ff54 100644
--- a/src/GameDraw.cpp
+++ b/src/GameDraw.cpp
@@ -567,13 +567,13 @@ void Game::DrawGLScene(void)
 
 			glClearColor(fogcolorr,fogcolorg,fogcolorb,1);
 			if (environment == sunny_environment) {
-				fog.SetFog(fogcolorr, fogcolorg, fogcolorb, 0, viewdistance * 0.8, 0.1);
+				setFog(&fog, fogcolorr, fogcolorg, fogcolorb, 0, viewdistance * 0.8, 0.1);
 				GLfloat LightAmbient[]=	{ fogcolorr/4, fogcolorg/4, fogcolorb/4, 1.0f};
 				GLfloat LightDiffuse[]=	{ fogcolorr*1.6f, fogcolorg*1.6f, fogcolorr*1.6f, 1.0f };
 				glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
 				glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse);
 			} else {
-				fog.SetFog(fogcolorr, fogcolorg, fogcolorb, 0, viewdistance * 0.8, 0.2);
+				setFog(&fog, fogcolorr, fogcolorg, fogcolorb, 0, viewdistance * 0.8, 0.2);
 				GLfloat LightAmbient[]=	{ fogcolorr*.8f, fogcolorg*.8f, fogcolorb*.8f, 1.0f};
 				GLfloat LightDiffuse[]=	{ fogcolorr*.8f, fogcolorg*.8f, fogcolorr*.8f, 1.0f };
 				glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient);
@@ -595,7 +595,7 @@ void Game::DrawGLScene(void)
 			fogcolorr=(sinefluct/4+.5);
 			fogcolorg=0;
 			fogcolorb=0;
-			fog.SetFog(fogcolorr,fogcolorg,fogcolorb,0,viewdistance*.8*.5*(sinefluct/4+.3),sinefluct/3+.7);
+			setFog(&fog, fogcolorr,fogcolorg,fogcolorb,0,viewdistance*.8*.5*(sinefluct/4+.3),sinefluct/3+.7);
 			glClearColor(fogcolorr,fogcolorg,fogcolorb,1);
 
 			ReSizeGLScene(this, 120.0f - sinefluct * 20.0f, 0.3f);
@@ -781,14 +781,11 @@ void Game::DrawGLScene(void)
 
 		}
 
-		//Decals
-
+		// Decals
 		decals.draw();
 
-		//Occluding blocks
-
+		// Occluding blocks
 		beginx=(camera.position.x+block_spacing/2)/block_spacing-2;
-
 		if(beginx<0)beginx=0;
 
 		beginz=(camera.position.z+block_spacing/2)/block_spacing-2;
@@ -804,31 +801,24 @@ void Game::DrawGLScene(void)
 		if(endz>num_blocks-1)endz=num_blocks-1;
 
 		float M[16];
-
 		XYZ drawpoint;
-
 		float size=20;
 
-		//Draw people
-
-		if(visions==1)fog.SetFog(fogcolorr,fogcolorg,fogcolorb,0,viewdistance*.8*.5*(-sinefluct/4+.3),-sinefluct/3+.7);
-
-		glColor4f(1,1,1,1);
+		// Draw people
+		if (visions)
+			setFog(&fog, fogcolorr, fogcolorg, fogcolorb, 0,
+				viewdistance * 0.8 * 0.5 * (-sinefluct / 4 + 0.3),
+				-sinefluct / 3 + 0.7);
 
+		glColor4f(1 , 1, 1, 1);
 		glEnable(GL_COLOR_MATERIAL);
-
 		glEnable(GL_BLEND);
-
 		for(int i=0;i<numpeople;i++){
-
 			draw=1;
-
 			if(person[i].skeleton.free<1){
-
 				if(person[i].whichblockx>=0&&person[i].whichblockx<num_blocks&&person[i].whichblocky>=0&&person[i].whichblocky<num_blocks){
 
 					if(!drawn[person[i].whichblockx][person[i].whichblocky])draw=0;
-
 				}else draw=0;
 
 				if(draw)
diff --git a/src/GameInitDispose.cpp b/src/GameInitDispose.cpp
index 6573008..d4319b5 100644
--- a/src/GameInitDispose.cpp
+++ b/src/GameInitDispose.cpp
@@ -978,7 +978,7 @@ void initGame(Game* game)
 	bodyguard.attackframe = -1;
 	game->spawndelay = 0;
 
-	fog.SetFog(fogcolorr, fogcolorg, fogcolorb, 0,
+	setFog(&fog, fogcolorr, fogcolorg, fogcolorb, 0,
 		game->viewdistance * 0.8f, 0.1f);
 
 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
diff --git a/src/Sprites.cpp b/src/Sprites.cpp
index 239c0a8..e96577e 100644
--- a/src/Sprites.cpp
+++ b/src/Sprites.cpp
@@ -1,7 +1,6 @@
 #include <cmath>
 
 #include "Camera.h"
-#include "Fog.h"
 #include "Models.h"
 #include "Sprites.h"
 #include "misc.h"
@@ -149,15 +148,48 @@ void Sprites::draw()
 	glDisable(GL_LIGHTING);
 	glDepthMask(0);
 	glAlphaFunc(GL_GREATER, 0.01);
-	for(int i=0;i<howmanysprites;i++){
-		if(type[i]==muzzleflashsprite){fog.TempFog(0,0,0); glBindTexture(GL_TEXTURE_2D, muzzleflaretextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE);}
-		if(type[i]==flashsprite){fog.TempFog(0,0,0); glBindTexture(GL_TEXTURE_2D, flaretextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE);}
-		if(type[i]==smokesprite||type[i]==smokespritenoup){fog.ResetFog(); glBindTexture(GL_TEXTURE_2D,  smoketextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);}
-		if(type[i]==bloodspritedown||type[i]==bloodspritenoup){fog.ResetFog(); glBindTexture(GL_TEXTURE_2D,  smoketextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);}
-		if(type[i]==particlesspritedown){fog.ResetFog(); glBindTexture(GL_TEXTURE_2D,  bloodtextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);}
-		if(type[i]==snowsprite){fog.ResetFog(); glBindTexture(GL_TEXTURE_2D,  snowtextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);}
-		if(type[i]==rainsprite){fog.ResetFog(); glBindTexture(GL_TEXTURE_2D,  raintextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);}
-		if(type[i]==bullet||type[i]==bulletinstant){fog.ResetFog(); glBindTexture(GL_TEXTURE_2D,  bullettextureptr);glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);}
+	for (int i = 0; i < howmanysprites; ++i) {
+		switch (type[i]) {
+		case muzzleflashsprite:
+			tempFog(&fog, 0, 0, 0);
+			glBindTexture(GL_TEXTURE_2D, muzzleflaretextureptr);
+			glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+			break;
+		case flashsprite:
+			tempFog(&fog, 0, 0, 0);
+			glBindTexture(GL_TEXTURE_2D, flaretextureptr);
+			glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+			break;
+		case smokesprite:
+		case smokespritenoup:
+		case bloodspritedown:
+		case bloodspritenoup:
+			resetFog(&fog);
+			glBindTexture(GL_TEXTURE_2D, smoketextureptr);
+			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+			break;
+		case particlesspritedown:
+			resetFog(&fog);
+			glBindTexture(GL_TEXTURE_2D, bloodtextureptr);
+			glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+			break;
+		case snowsprite:
+			resetFog(&fog);
+			glBindTexture(GL_TEXTURE_2D, snowtextureptr);
+			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+			break;
+		case rainsprite:
+			resetFog(&fog);
+			glBindTexture(GL_TEXTURE_2D, raintextureptr);
+			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+			break;
+		case bullet:
+		case bulletinstant:
+			resetFog(&fog);
+			glBindTexture(GL_TEXTURE_2D, bullettextureptr);
+			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+			break;
+		}
 
 		glPushMatrix();
 		if(type[i]==muzzleflashsprite||type[i]==flashsprite||type[i]==smokesprite||type[i]==smokespritenoup||type[i]==snowsprite||type[i]==particlesspritedown||((type[i]==bloodspritenoup||type[i]==bloodspritedown)&&blood)){
@@ -276,7 +308,7 @@ void Sprites::draw()
 		}
 		glPopMatrix();
 	}
-	fog.ResetFog();
+	resetFog(&fog);
 	glDepthMask(1);
 	glDisable(GL_TEXTURE_2D);
 	glEnable(GL_CULL_FACE);
diff --git a/src/misc.h b/src/misc.h
index a6b5e6b..4e68f90 100644
--- a/src/misc.h
+++ b/src/misc.h
@@ -52,6 +52,13 @@ struct Scores {
 	bool completed;
 };
 
+struct Fog {
+	GLfloat color[4];
+	GLfloat density;
+	GLfloat start;
+	GLfloat end;
+};
+
 #ifdef __cplusplus
 extern "C" {
 #endif // __cplusplus
@@ -66,6 +73,10 @@ extern "C" {
 	float randFloat();
 	int32_t randInt(int32_t at_least, int32_t at_most);
 	uint32_t randUint(uint32_t less_than);
+	void setFog(struct Fog*, GLfloat, GLfloat, GLfloat,
+	            GLfloat, GLfloat, GLfloat);
+	void tempFog(struct Fog*, GLfloat, GLfloat, GLfloat);
+	void resetFog(struct Fog*);
 #ifdef __cplusplus
 } // extern "C"
 #endif // __cplusplus
diff --git a/src/misc.zig b/src/misc.zig
index e58fb30..d6063eb 100644
--- a/src/misc.zig
+++ b/src/misc.zig
@@ -317,7 +317,7 @@ fn check(comptime errorString: fn (c_uint) callconv(.C) [*c]const u8,
 }
 
 /// Load PNG file into an OpenGL buffer and return it.
-export fn loadTexture(filename: [*:0]const u8) c.GLuint {
+export fn loadTexture(filename: [*:0]const u8) u32 {
     const file = readFile(cwd(), data_dir ++ "textures{c}{s}", .{
         sep, filename,
     }) catch unreachable;
@@ -327,7 +327,7 @@ export fn loadTexture(filename: [*:0]const u8) c.GLuint {
     defer image.deinit(allocator);
     const data = @ptrCast([*c]const u8, image.pixels.ptr);
 
-    var texture: c.GLuint = undefined;
+    var texture: u32 = undefined;
     c.glGenTextures(1, &texture);
     c.glBindTexture(c.GL_TEXTURE_2D, texture);
     defer c.glBindTexture(c.GL_TEXTURE_2D, 0);
@@ -335,8 +335,8 @@ export fn loadTexture(filename: [*:0]const u8) c.GLuint {
     c.glTexParameteri(c.GL_TEXTURE_2D, c.GL_TEXTURE_MAG_FILTER, c.GL_LINEAR);
     c.glTexParameteri(c.GL_TEXTURE_2D, c.GL_TEXTURE_MIN_FILTER, c.GL_LINEAR);
 
-    const width = @intCast(c.GLint, image.width);
-    const height = @intCast(c.GLint, image.height);
+    const width = @intCast(i32, image.width);
+    const height = @intCast(i32, image.height);
     c.glPixelStorei(c.GL_UNPACK_ALIGNMENT, 1);
     c.glTexImage2D(c.GL_TEXTURE_2D, 0, 4, width, height,
                    0, c.GL_RGBA, c.GL_UNSIGNED_BYTE, data);
@@ -374,3 +374,44 @@ pub fn saveScores(base_dir: []const u8, current: Scores) !void {
     defer allocator.free(data);
     try dir.writeFile("scores.ini", data);
 }
+
+/// OpenGL fog state.
+const Fog = extern struct {
+    color: [4]f32,
+    density: f32,
+    start: f32,
+    end: f32,
+};
+
+/// Set fog effect.
+export fn setFog(fog: *Fog, r: f32, g: f32, b: f32,
+                 start: f32, end: f32, density: f32) void {
+    fog.color = .{r, g, b, 1.0};
+    fog.density = density;
+    fog.start = start;
+    fog.end = end;
+    resetFog(fog);
+}
+
+/// Set temporary fog effect.
+export fn tempFog(fog: *Fog, r: f32, g: f32, b: f32) void {
+    const color = [4]f32{r, g, b, 1.0};
+    c.glFogi(c.GL_FOG_MODE, c.GL_LINEAR);
+    c.glFogfv(c.GL_FOG_COLOR, &color);
+    c.glFogf(c.GL_FOG_DENSITY, fog.density);
+    c.glFogi(c.GL_FOG_HINT, c.GL_DONT_CARE);
+    c.glFogf(c.GL_FOG_START, fog.start);
+    c.glFogf(c.GL_FOG_END, fog.end);
+    c.glEnable(c.GL_FOG);
+}
+
+/// Reset fog effect.
+export fn resetFog(fog: *Fog) void {
+    c.glFogi(c.GL_FOG_MODE, c.GL_LINEAR);
+    c.glFogfv(c.GL_FOG_COLOR, &fog.color);
+    c.glFogf(c.GL_FOG_DENSITY, fog.density);
+    c.glFogi(c.GL_FOG_HINT, c.GL_DONT_CARE);
+    c.glFogf(c.GL_FOG_START, fog.start);
+    c.glFogf(c.GL_FOG_END, fog.end);
+    c.glEnable(c.GL_FOG);
+}