diff options
-rw-r--r-- | build.zig | 1 | ||||
-rw-r--r-- | src/Decals.cpp | 2 | ||||
-rw-r--r-- | src/Fog.cpp | 53 | ||||
-rw-r--r-- | src/Fog.h | 21 | ||||
-rw-r--r-- | src/Game.h | 1 | ||||
-rw-r--r-- | src/GameDraw.cpp | 32 | ||||
-rw-r--r-- | src/GameInitDispose.cpp | 2 | ||||
-rw-r--r-- | src/Sprites.cpp | 54 | ||||
-rw-r--r-- | src/misc.h | 11 | ||||
-rw-r--r-- | src/misc.zig | 49 |
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); +} |