From 9234eeb1d2954a3dae6c84ffa8ed8643953272c5 Mon Sep 17 00:00:00 2001 From: xolatile Date: Tue, 5 Aug 2025 15:27:57 +0200 Subject: [PATCH] Experimental MD3 to OBJ to IQM converter and code removal, shit compiles... --- data/defaults.cfg | 25 +- data/glsl.cfg | 340 +-------- data/menus.cfg | 11 - packages/models/debris/debris01/tris.md2 | Bin 2004 -> 0 bytes packages/models/debris/debris02/tris.md2 | Bin 1860 -> 0 bytes packages/models/debris/debris03/tris.md2 | Bin 1064 -> 0 bytes packages/models/debris/debris04/tris.md2 | Bin 1976 -> 0 bytes packages/models/debris/license.txt | 100 --- packages/models/debris/masks.png | Bin 13155 -> 0 bytes packages/models/debris/md2.cfg | 2 - packages/models/debris/skin.png | Bin 16603 -> 0 bytes packages/models/gibs/gib01/skin.png | Bin 6238 -> 0 bytes packages/models/gibs/gib01/tris.md2 | Bin 600 -> 0 bytes packages/models/gibs/gib02/skin.png | Bin 6274 -> 0 bytes packages/models/gibs/gib02/tris.md2 | Bin 824 -> 0 bytes packages/models/gibs/gib03/skin.png | Bin 9476 -> 0 bytes packages/models/gibs/gib03/tris.md2 | Bin 4988 -> 0 bytes packages/models/gibs/license.txt | 50 -- packages/models/gibs/md2.cfg | 5 - packages/models/health/iqm.cfg | 12 + packages/models/health/md3.cfg | 12 - packages/models/health/model.iqm | Bin 0 -> 21736 bytes packages/models/health/model.md3 | Bin 11732 -> 0 bytes src/Makefile | 10 +- src/engine/3dgui.cpp | 17 +- src/engine/animmodel.h | 81 +-- src/engine/blend.cpp | 862 ----------------------- src/engine/depthfx.h | 172 ----- src/engine/dynlight.cpp | 1 - src/engine/engine.h | 35 +- src/engine/explosion.h | 67 +- src/engine/lightmap.cpp | 286 +------- src/engine/lightmap.h | 1 - src/engine/main.cpp | 4 - src/engine/material.cpp | 10 +- src/engine/model.h | 2 - src/engine/octa.h | 12 +- src/engine/octaedit.cpp | 48 +- src/engine/octarender.cpp | 39 +- src/engine/rendergl.cpp | 23 +- src/engine/rendermodel.cpp | 10 +- src/engine/renderparticles.cpp | 74 +- src/engine/renderva.cpp | 154 +--- src/engine/shader.cpp | 8 - src/engine/skelmodel.h | 7 +- src/engine/texture.cpp | 68 +- src/engine/texture.h | 7 +- src/engine/world.cpp | 8 - src/engine/world.h | 19 - src/engine/worldio.cpp | 14 - src/fpsgame/game.h | 1 - src/shared/ents.h | 2 +- src/shared/iengine.h | 2 +- temporary/converter.c | 82 +++ 54 files changed, 188 insertions(+), 2495 deletions(-) delete mode 100644 packages/models/debris/debris01/tris.md2 delete mode 100644 packages/models/debris/debris02/tris.md2 delete mode 100644 packages/models/debris/debris03/tris.md2 delete mode 100644 packages/models/debris/debris04/tris.md2 delete mode 100644 packages/models/debris/license.txt delete mode 100644 packages/models/debris/masks.png delete mode 100644 packages/models/debris/md2.cfg delete mode 100644 packages/models/debris/skin.png delete mode 100644 packages/models/gibs/gib01/skin.png delete mode 100644 packages/models/gibs/gib01/tris.md2 delete mode 100644 packages/models/gibs/gib02/skin.png delete mode 100644 packages/models/gibs/gib02/tris.md2 delete mode 100644 packages/models/gibs/gib03/skin.png delete mode 100644 packages/models/gibs/gib03/tris.md2 delete mode 100644 packages/models/gibs/license.txt delete mode 100644 packages/models/gibs/md2.cfg create mode 100644 packages/models/health/iqm.cfg delete mode 100644 packages/models/health/md3.cfg create mode 100644 packages/models/health/model.iqm delete mode 100644 packages/models/health/model.md3 delete mode 100644 src/engine/blend.cpp delete mode 100644 src/engine/depthfx.h create mode 100644 temporary/converter.c diff --git a/data/defaults.cfg b/data/defaults.cfg index 35bdf19..71e4687 100644 --- a/data/defaults.cfg +++ b/data/defaults.cfg @@ -115,10 +115,10 @@ bind Z [ togglezoom ] // Sauerbraten Editing related bindings // found in autoexec.cfg in your sauerbraten directory -editbind SPACE [ cancelsel ] -editbind MOUSE1 [ if $blendpaintmode [paintblendmap] [editdrag] ] +editbind SPACE [ cancelsel ] +editbind MOUSE1 [ editdrag ] editbind MOUSE3 [ selcorners ] -editbind MOUSE2 [ if $blendpaintmode [rotateblendbrush] [editextend] ] +editbind MOUSE2 [ editextend ] editbind J [ gotosel ] @@ -185,16 +185,11 @@ editbind B [ domodifier 9 ] editbind COMMA [ domodifier 10; onrelease entautoview ] delta_edit_0 = [ - if $blendpaintmode [ - scrollblendbrush $arg1 - ] [ - editfacewentpush $arg1 1 // Fill and Empty cube - ] + editfacewentpush $arg1 1 // Fill and Empty cube ] delta_edit_1 = [ nodebug [ gridpower (+ $arg1 $gridpower) ] ] delta_edit_2 = [ editfacewentpush $arg1 0 ] // push face/corners selected delta_edit_3 = [ editfacewentpush $arg1 2 ] // push corner pointed at by cursor -delta_edit_4 = [ if $blendpaintmode [rotateblendbrush $arg1] [editrotate $arg1] ] // rotate 90 degrees delta_edit_5 = [ entproperty 0 $arg1 ] // and the others delta_edit_6 = [ edittex $arg1 ] // change textures delta_edit_10 = [ entautoview $arg1 ] @@ -218,15 +213,3 @@ delta_edit_18 = [ vdelta [vscale (if (< $arg1 0) 0.5 2)] ] // vSlot: scale //editbind RALT [multiplier2 = 32;onrelease [multiplier2 = 16]] multiplier = 1 multiplier2 = 16 - -//Blendmap Painting -editbind KP0 [setblendpaintmode 0] -editbind KP1 [setblendpaintmode 1] -editbind KP2 [setblendpaintmode 2] -editbind KP3 [setblendpaintmode 3] -editbind KP4 [setblendpaintmode 4] -editbind KP5 [setblendpaintmode 5] - -editbind KP8 [scrollblendbrush -1] -editbind KP9 [scrollblendbrush 1] - diff --git a/data/glsl.cfg b/data/glsl.cfg index d2495eb..dac63f2 100644 --- a/data/glsl.cfg +++ b/data/glsl.cfg @@ -253,73 +253,6 @@ defershader 0 "decalworld" [ ] [] [] [uniform sampler2D decal;] ] -glowshader = [ - defershader 0 $arg1 [ - defuniformparam "glowcolor" 1 1 1 // glow color - worldshader @arg1 [] [] [ - vec3 glow = texture2D(glowmap, texcoord0).rgb; - glow *= glowcolor.rgb; - gl_FragColor = diffuse*lm + vec4(glow, 0.0); - ] [] [uniform sampler2D glowmap;] - glareworldshader @arg1 [] [ - vec3 glow = texture2D(glowmap, texcoord0).rgb; - glow *= glowcolor.rgb; - float k = max(glow.r, max(glow.g, glow.b)); - gl_FragColor.rgb = min(k*k*32.0, 1.0) * glow; - gl_FragColor.a = - //:variantoverride texture2D(lightmap, texcoord1).a - colorparams.a - ; - ] [] [ - uniform sampler2D glowmap; - //:variant uniform sampler2D lightmap; - ] - ] -] -glowshader "glowworld" -glowshader "glowalphaworld" - -defershader 0 "pulseworld" [ - defuniformparam "pulsespeed" 1 // pulse frequency (Hz) - worldshader "pulseworld" [ - pulse = abs(fract(millis * pulsespeed.x)*2.0 - 1.0); - ] [ - vec3 diffuse2 = texture2D(decal, texcoord0).rgb; - diffuse.rgb = mix(diffuse.rgb, diffuse2, pulse); - ] [] [uniform float millis; varying float pulse;] [uniform sampler2D decal;] -] - -pulseglowshader = [ - defershader 0 $arg1 [ - defuniformparam "glowcolor" 1 1 1 // glow color - defuniformparam "pulseglowspeed" 1 // pulse frequency (Hz) - defuniformparam "pulseglowcolor" 0 0 0 // pulse glow color - worldshader @arg1 [ - pulse = mix(glowcolor.rgb, pulseglowcolor.rgb, abs(fract(millis * pulseglowspeed.x)*2.0 - 1.0)); - ] [] [ - vec3 glow = texture2D(glowmap, texcoord0).rgb; - gl_FragColor = diffuse*lm + vec4(glow*pulse, 0.0); - ] [uniform float millis; varying vec3 pulse;] [uniform sampler2D glowmap;] - glareworldshader @arg1 [ - pulse = mix(glowcolor.rgb, pulseglowcolor.rgb, abs(fract(millis * pulseglowspeed.x)*2.0 - 1.0)); - ] [ - vec3 glow = texture2D(glowmap, texcoord0).rgb; - glow *= pulse; - float k = max(glow.r, max(glow.g, glow.b)); - gl_FragColor.rgb = min(k*k*32.0, 1.0) * glow; - gl_FragColor.a = - //:variantoverride texture2D(lightmap, texcoord1).a - colorparams.a - ; - ] [uniform float millis; varying vec3 pulse;] [ - uniform sampler2D glowmap; - //:variant uniform sampler2D lightmap; - ] - ] -] -pulseglowshader "pulseglowworld" -pulseglowshader "pulseglowalphaworld" - shader 0 "noglareworld" [ attribute vec4 vvertex; uniform mat4 camprojmatrix; @@ -371,52 +304,12 @@ shader 0 "noglarealphaworld" [ } ] -shader 0 "depthfxworld" [ - attribute vec4 vvertex; - uniform mat4 camprojmatrix; - uniform vec4 depthscale, depthoffsets; - varying vec4 depthranges; - void main(void) - { - gl_Position = camprojmatrix * vvertex; - depthranges = depthoffsets + gl_Position.w*depthscale; - } -] [ - varying vec4 depthranges; - void main(void) - { - gl_FragColor = depthranges; - } -] - -shader 0 depthfxsplitworld [ - attribute vec4 vvertex; - uniform mat4 camprojmatrix; - uniform vec4 depthscale, depthoffsets; - varying vec4 depthranges; - void main(void) - { - gl_Position = camprojmatrix * vvertex; - depthranges = depthoffsets + gl_Position.w*depthscale; - } -] [ - varying vec4 depthranges; - void main(void) - { - vec4 ranges = vec4(depthranges.x, fract(depthranges.yzw)); - ranges.xy -= ranges.yz*vec2(0.00390625, 0.00390625); - gl_FragColor = ranges; - } -] - // bumptype: // o -> orthonormalize // t -> tangent space cam // s -> spec // S -> spec map // p -> parallax -// g -> glow -// G -> pulse glow // a -> alpha map btopt = [ >= (strstr $bumptype $arg1) 0 ] @@ -425,13 +318,6 @@ bumpvariantshader = [ bumptype = $arg2 stype = (? (btopt "e") 3 1) if (! (btopt "i")) [ - if (btopt "G") [ - defuniformparam "glowcolor" 1 1 1 // glow color - defuniformparam "pulseglowspeed" 1 // pulse frequency (Hz) - defuniformparam "pulseglowcolor" 0 0 0 // pulse glow color - ] [if (btopt "g") [ - defuniformparam "glowcolor" 1 1 1 // glow color - ]] if (btopt "S") [ defuniformparam "specscale" 6 6 6 // spec map multiplier ] [if (btopt "s") [ @@ -440,11 +326,6 @@ bumpvariantshader = [ if (|| (btopt "p") (btopt "P")) [ defuniformparam "parallaxscale" 0.06 -0.03 // parallax scaling ] - if (btopt "R") [ - defuniformparam "envscale" 1 1 1 // reflectivity map multiplier - ] [if (btopt "r") [ - defuniformparam "envscale" 0.2 0.2 0.2 // reflectivity - ]] ] [ if (btopt "s") [stype = (+ $stype 8)] ] @@ -457,9 +338,6 @@ bumpvariantshader = [ uniform mat4 camprojmatrix; uniform vec2 texgenscroll; varying vec2 texcoord0, texcoord1; - @(if (|| (btopt "t") (btopt "r")) [result [uniform vec3 camera; varying vec3 camvec;]]) - @(if (btopt "G") [result [uniform float millis; varying float pulse;]]) - @(if (btopt "r") [result [varying mat3 world;]]) void main(void) { gl_Position = camprojmatrix * vvertex; @@ -482,10 +360,6 @@ bumpvariantshader = [ ]]) ]]) - @(if (btopt "G") [result [ - pulse = abs(fract(millis*pulseglowspeed.x)*2.0 - 1.0); - ]]) - @(if (|| (! (btopt "i")) (btopt "s")) [result [ //:dynlight ]]) @@ -499,11 +373,6 @@ bumpvariantshader = [ varying vec2 texcoord0, texcoord1; uniform sampler2D diffusemap, lmcolor, lmdir; @(if (|| (! (btopt "i")) (btopt "s") (btopt "p") (btopt "P")) [result [uniform sampler2D normalmap;]]) - @(if (|| (btopt "t") (btopt "r")) [result [varying vec3 camvec;]]) - @(if (btopt "g") [result [uniform sampler2D glowmap;]]) - @(if (btopt "G") [result [varying float pulse;]]) - @(if (btopt "r") [result [uniform samplerCube envmap; varying mat3 world;]]) - @(if (|| (! (btopt "i")) (btopt "s")) [result [uniform vec4 ambient;]]) void main(void) { @(if (|| (! (btopt "i")) (btopt "s")) [result [ @@ -530,28 +399,6 @@ bumpvariantshader = [ ]]) @(if (|| (btopt "p") (btopt "P")) [] [result [#define dtc texcoord0]]) - @(if (|| (! (btopt "i")) (btopt "S") (btopt "a")) [result [ - vec4 diffuse = texture2D(diffusemap, dtc); - @(if (&& (btopt "a") (! (btopt "S"))) [result [ - #define alpha diffuse.a - ]]) - ]]) - @(if (! (btopt "i")) [result [ - diffuse.rgb *= colorparams.rgb; - ]]) - @(if (|| (! (btopt "i")) (btopt "s") (btopt "a")) [result [ - @(if (! (btopt "P")) [ - if (&& (btopt "a") (btopt "S")) [result [ - vec4 normal = texture2D(normalmap, dtc); - #define alpha normal.a - #define bump normal.rgb - ]] [result [ - vec3 bump = texture2D(normalmap, dtc).rgb; - ]] - ]) - bump = bump*2.0 - 1.0; - ]]) - @(if (btopt "s") [result [ vec3 halfangle = normalize(camdir + lmlv); float spec = pow(clamp(dot(halfangle, bump), 0.0, 1.0), @(? (btopt "i") "128.0" "32.0")); @@ -564,65 +411,6 @@ bumpvariantshader = [ ]]) ]]) - @(if (|| (! (btopt "i")) (btopt "s")) [result [ - lmc.rgb = max(lmc.rgb*clamp(dot(lmlv, bump), 0.0, 1.0), ambient.xyz); - @(if (btopt "i") [result [ - //:dynlight lmc - - @(? (btopt "g") "diffuse.rgb" "gl_FragColor.rgb") = diffuse.rgb * lmc.rgb; - ]] [result [ - //:shadowmap lmc - //:dynlight lmc - - @(? (|| (btopt "g") (btopt "r")) "diffuse.rgb" "gl_FragColor.rgb") = diffuse.rgb * lmc.rgb; - ]]) - ]]) - - @(if (btopt "r") [result [ - vec3 rvec; - @(if (btopt "t") [result [ - vec3 rvects = 2.0*bump*dot(camvec, bump) - camvec; - rvec = world * rvects; - ]] [result [ - vec3 bumpw = world * bump; - rvec = 2.0*bumpw*dot(camvec, bumpw) - camvec; - ]]) - vec3 reflect = textureCube(envmap, rvec).rgb; - @@(if (btopt "R") [result [ - vec3 rmod = envscale.xyz*diffuse.a; - ]] [result [ - #define rmod envscale.xyz - ]]) - @(? (btopt "g") "diffuse.rgb" "gl_FragColor.rgb") = mix(diffuse.rgb, reflect, rmod); - ]]) - - @(if (btopt "a") [result [ - @(? (btopt "g") "diffuse.rgb" "gl_FragColor.rgb") *= alpha; - ]]) - - @(if (btopt "g") [result [ - vec3 glow = texture2D(glowmap, dtc).rgb; - @@(if (btopt "G") [result [ - vec3 pulsecol = mix(glowcolor.xyz, pulseglowcolor.xyz, pulse); - ]]) - @@(if (btopt "i") [result [ - glow *= @(? (btopt "G") "pulsecol" "glowcolor.xyz"); - float k = max(glow.r, max(glow.g, glow.b)); - k = min(k*k*32.0, 1.0); - @(if (btopt "s") [result [ - gl_FragColor.rgb = glow*k + diffuse.rgb; - ]] [result [ - gl_FragColor.rgb = glow*k; - gl_FragColor.a = - //:variantoverride texture2D(lmcolor, texcoord1).a - colorparams.a - ; - ]]) - ]] [result [ - gl_FragColor.rgb = glow * @(? (btopt "G") "pulsecol" "glowcolor.xyz") + diffuse.rgb; - ]]) - ]]) - @(if (btopt "a") [result [ gl_FragColor.a *= alpha; //:fog fogcolor * alpha @@ -656,20 +444,6 @@ bumpshader "bumpspecmapalphaworld" "otsSa" fastshader bumpspecmapalphaworld bumpalphaworld 1 altshader bumpspecmapalphaworld bumpalphaworld -bumpshader "bumpglowworld" "g" -bumpshader "bumpspecglowworld" "otsg" -altshader bumpspecglowworld bumpglowworld -bumpshader "bumpspecmapglowworld" "otsSg" -fastshader bumpspecmapglowworld bumpglowworld 2 -altshader bumpspecmapglowworld bumpglowworld - -bumpshader "bumppulseglowworld" "gG" -bumpshader "bumpspecpulseglowworld" "otsgG" -altshader bumpspecpulseglowworld bumppulseglowworld -bumpshader "bumpspecmappulseglowworld" "otsSgG" -fastshader bumpspecmappulseglowworld bumppulseglowworld 2 -altshader bumpspecmappulseglowworld bumppulseglowworld - bumpshader "bumpparallaxworld" "pot" fastshader bumpparallaxworld bumpworld 1 altshader bumpparallaxworld bumpworld @@ -682,30 +456,6 @@ fastshader bumpspecmapparallaxworld bumpparallaxworld 2 fastshader bumpspecmapparallaxworld bumpworld 1 altshader bumpspecmapparallaxworld bumpworld -bumpshader "bumpparallaxglowworld" "potg" -fastshader bumpparallaxglowworld bumpglowworld 1 -altshader bumpparallaxglowworld bumpglowworld -bumpshader "bumpspecparallaxglowworld" "potsg" -fastshader bumpspecparallaxglowworld bumpparallaxglowworld 2 -fastshader bumpspecparallaxglowworld bumpglowworld 1 -altshader bumpspecparallaxglowworld bumpglowworld -bumpshader "bumpspecmapparallaxglowworld" "potsSg" -fastshader bumpspecmapparallaxglowworld bumpparallaxglowworld 2 -fastshader bumpspecmapparallaxglowworld bumpglowworld 1 -altshader bumpspecmapparallaxglowworld bumpglowworld - -bumpshader "bumpparallaxpulseglowworld" "potgG" -fastshader bumpparallaxpulseglowworld bumppulseglowworld 1 -altshader bumpparallaxpulseglowworld bumppulseglowworld -bumpshader "bumpspecparallaxpulseglowworld" "potsgG" -fastshader bumpspecparallaxpulseglowworld bumpparallaxpulseglowworld 2 -fastshader bumpspecparallaxpulseglowworld bumppulseglowworld 1 -altshader bumpspecparallaxpulseglowworld bumppulseglowworld -bumpshader "bumpspecmapparallaxpulseglowworld" "potsSgG" -fastshader bumpspecmapparallaxpulseglowworld bumpparallaxpulseglowworld 2 -fastshader bumpspecmapparallaxpulseglowworld bumppulseglowworld 1 -altshader bumpspecmapparallaxpulseglowworld bumppulseglowworld - bumpshader "bumpenvworldalt" "e" bumpshader "bumpenvworld" "eor" altshader bumpenvworld bumpenvworldalt @@ -717,28 +467,6 @@ bumpshader "bumpenvspecmapworld" "eotsSrR" altshader bumpenvspecmapworld bumpenvworldalt fastshader bumpenvspecmapworld bumpenvworldalt 2 -bumpshader "bumpenvglowworldalt" "eg" -bumpshader "bumpenvglowworld" "eorg" -altshader bumpenvglowworld bumpenvglowworldalt -fastshader bumpenvglowworld bumpenvglowworldalt 2 -bumpshader "bumpenvspecglowworld" "eotsrg" -altshader bumpenvspecglowworld bumpenvglowworldalt -fastshader bumpenvspecglowworld bumpenvglowworldalt 2 -bumpshader "bumpenvspecmapglowworld" "eotsSrRg" -altshader bumpenvspecmapglowworld bumpenvglowworldalt -fastshader bumpenvspecmapglowworld bumpenvglowworldalt 2 - -bumpshader "bumpenvpulseglowworldalt" "egG" -bumpshader "bumpenvpulseglowworld" "eorgG" -altshader bumpenvpulseglowworld bumpenvpulseglowworldalt -fastshader bumpenvpulseglowworld bumpenvpulseglowworldalt 2 -bumpshader "bumpenvspecpulseglowworld" "eotsrgG" -altshader bumpenvspecpulseglowworld bumpenvpulseglowworldalt -fastshader bumpenvspecpulseglowworld bumpenvpulseglowworldalt 2 -bumpshader "bumpenvspecmappulseglowworld" "eotsSrRgG" -altshader bumpenvspecmappulseglowworld bumpenvpulseglowworldalt -fastshader bumpenvspecmappulseglowworld bumpenvpulseglowworldalt 2 - bumpshader "bumpenvparallaxworldalt" "epot" altshader bumpenvparallaxworldalt bumpenvworldalt bumpshader "bumpenvparallaxworld" "epotr" @@ -754,36 +482,6 @@ altshader bumpenvspecmapparallaxworld bumpenvparallaxworldalt fastshader bumpenvspecmapparallaxworld bumpenvparallaxworldalt 2 fastshader bumpenvspecmapparallaxworld bumpenvworldalt 1 -bumpshader "bumpenvparallaxglowworldalt" "epotg" -altshader bumpenvparallaxglowworldalt bumpenvglowworldalt -bumpshader "bumpenvparallaxglowworld" "epotrg" -altshader bumpenvparallaxglowworld bumpenvparallaxglowworldalt -fastshader bumpenvparallaxglowworld bumpenvparallaxglowworldalt 2 -fastshader bumpenvparallaxglowworld bumpenvglowworldalt 1 -bumpshader "bumpenvspecparallaxglowworld" "epotsrg" -altshader bumpenvspecparallaxglowworld bumpenvparallaxglowworldalt -fastshader bumpenvspecparallaxglowworld bumpenvparallaxglowworldalt 2 -fastshader bumpenvspecparallaxglowworld bumpenvglowworldalt 1 -bumpshader "bumpenvspecmapparallaxglowworld" "epotsSrRg" -altshader bumpenvspecmapparallaxglowworld bumpenvparallaxglowworldalt -fastshader bumpenvspecmapparallaxglowworld bumpenvparallaxglowworldalt 2 -fastshader bumpenvspecmapparallaxglowworld bumpenvglowworldalt 1 - -bumpshader "bumpenvparallaxpulseglowworldalt" "epotgG" -altshader bumpenvparallaxpulseglowworldalt bumpenvpulseglowworldalt -bumpshader "bumpenvparallaxpulseglowworld" "epotrgG" -altshader bumpenvparallaxpulseglowworld bumpenvparallaxpulseglowpulseglowworldalt -fastshader bumpenvparallaxpulseglowworld bumpenvparallaxpulseglowpulseglowworldalt 2 -fastshader bumpenvparallaxpulseglowworld bumpenvpulseglowworldalt 1 -bumpshader "bumpenvspecparallaxpulseglowworld" "epotsrgG" -altshader bumpenvspecparallaxpulseglowworld bumpenvparallaxpulseglowworldalt -fastshader bumpenvspecparallaxpulseglowworld bumpenvparallaxpulseglowworldalt 2 -fastshader bumpenvspecparallaxpulseglowworld bumpenvpulseglowworldalt 1 -bumpshader "bumpenvspecmapparallaxpulseglowworld" "epotsSrRgG" -altshader bumpenvspecmapparallaxpulseglowworld bumpenvparallaxpulseglowworldalt -fastshader bumpenvspecmapparallaxpulseglowworld bumpenvparallaxpulseglowworldalt 2 -fastshader bumpenvspecmapparallaxpulseglowworld bumpenvpulseglowworldalt 1 - //////////////////////////////////////////////// // // model shaders @@ -973,7 +671,6 @@ modelvertexshader = [ ]]) @(if (mdlopt "e") [result [ uniform mat3 modelworld; - uniform vec2 envmapscale; varying vec3 rvec; varying float rmod; ]]) @@ -1031,7 +728,6 @@ modelvertexshader = [ @(if (mdlopt "e") [result [ float invfresnel = dot(camdir, mnormal); rvec = modelworld * (2.0*invfresnel*mnormal - camdir); - rmod = envmapscale.x*max(invfresnel, 0.0) + envmapscale.y; ]]) ]]) } @@ -1047,7 +743,6 @@ modelfragmentshader = [ @(if (mdlopt "e") [result [ #define lightvec lightdirworld uniform vec3 lightdirworld; - uniform vec2 envmapscale; varying vec3 camvec; varying mat3 world; ]] [result [ @@ -1082,11 +777,6 @@ modelfragmentshader = [ light.rgb *= 2.0; - @(if (mdlopt "m") [result [ - vec3 masks = texture2D(tex1, texcoord0).rgb; - vec3 glow = light.rgb * maskscale.y; - ]]) - @(if (mdlopt "n") [result [ vec3 normal = texture2D(tex3, texcoord0).rgb - 0.5; @(if (mdlopt "e") [result [ @@ -1134,7 +824,6 @@ modelfragmentshader = [ vec3 camn = normalize(camvec); float invfresnel = dot(camn, normal); vec3 rvec = 2.0*invfresnel*normal - camn; - float rmod = envmapscale.x*max(invfresnel, 0.0) + envmapscale.y; ]]) vec3 reflect = textureCube(tex2, rvec).rgb; @(if (! (mdlopt "m")) [result [ @@ -1142,18 +831,6 @@ modelfragmentshader = [ ]]) ]]) - @(if (mdlopt "m") [result [ - @(if (mdlopt "e") [result [ - light.rgb = mix(light.rgb, glow, masks.g); // glow mask in green channel - gl_FragColor.rgb = mix(light.rgb, reflect, rmod*masks.b); // envmap mask in blue channel - ]] [if (mdlopt "i") [result [ - float k = min(masks.g*masks.g*maskscale.w, 1.0); // glow mask in green channel - gl_FragColor.rgb = @(? (mdlopt "s") "glow*k + light.rgb" "glow*k"); - ]] [result [ - gl_FragColor.rgb = mix(light.rgb, glow, masks.g); // glow mask in green channel - ]]]) - ]]) - @(if (|| (mdlopt "i") (mdlopt "m") (mdlopt "e")) [result [ gl_FragColor.a = light.a * color.a; ]]) @@ -1169,12 +846,6 @@ modelshader = [ loop i 4 [ variantshader 0 $shadername 0 (modelvertexshader (concatword $arg1 "b") (+ $i 1)) [] ] - glaremodeltype = (strreplace (concatword $arg1 "i") "e") - if (< (strstr $glaremodeltype "s") 0) [glaremodeltype = (strreplace $glaremodeltype "n")] - variantshader 0 $shadername 1 (modelvertexshader $glaremodeltype) (modelfragmentshader $glaremodeltype) - loop i 4 [ - variantshader 0 $shadername 1 (modelvertexshader (concatword $glaremodeltype "b") (+ $i 1)) 1 - ] if (>= (strstr $arg1 "e") 0) [ altshader $shadername (modelshader (strreplace $arg1 "e")) ] @@ -1360,15 +1031,6 @@ explosionshader = [ vec2 dtc = texcoord0 + texture2D(tex0, texcoord2).xy*0.1; // use color texture as noise to distort texcoords vec4 diffuse = texture2D(tex0, dtc); float blend = max(pow(clamp(1.0 - dot(texcoord1, texcoord1), 0.0, 1.0), blendparams.x), blendparams.y); - @(if (>= (strstr $arg1 "glare") 0) [result [ - float k = blend*blend; - diffuse.rgb *= k*8.0; - diffuse.a *= k; - diffuse.b += k*k; - ]] [result [ - diffuse *= blend*4.0; // dup alpha into RGB channels + intensify and over saturate - diffuse.b += 0.5 - blend*0.5; // blue tint - ]]) @(if (>= (strstr $arg1 "soft") 0) [result [ gl_FragColor.rgb = diffuse.rgb * color.rgb; @@ -1387,7 +1049,7 @@ explosionshader = [ ] ] -looplist i ["" "glare" "soft" "soft8"] [ +looplist i ["" "soft" "soft8"] [ explosionshader [explosion@i] ] diff --git a/data/menus.cfg b/data/menus.cfg index 8bd1930..ac60501 100644 --- a/data/menus.cfg +++ b/data/menus.cfg @@ -445,17 +445,6 @@ newgui options [ /////////////////////////////////////////////////////////////// guiradio "^f2high quality" maxdynlights 5 ] ] - guilist [ - guicheckbox "^f0soft particles^t" depthfx - if $depthfx [ - guibar - guiradio "^f0low quality" depthfxsize 7 [blurdepthfx 1] - guibar - guiradio "^f2medium quality" depthfxsize 10 [blurdepthfx 0] - guibar - guiradio "^f3high quality" depthfxsize 12 [blurdepthfx 0] - ] - ] guilist [ guicheckbox "^f0decals^t^t" decals if $decals [ diff --git a/packages/models/debris/debris01/tris.md2 b/packages/models/debris/debris01/tris.md2 deleted file mode 100644 index e7905f0b82b856535344f16882ac6b489130ed42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2004 zcmZuxe@s<%6hFMj`vDIgyoZ3|>+!<}S;-Pb%*8!V2q!fxD$y|!wStUdzQn+lWX@J@ zsbeeL6Mv=IGI6D?$e66R)pEK1crlt=Yw~n$#%6>3$NC5QocoBK-SxI}?&rSqIp==P z`JQ_puWMZ9Cj3&877>h}A9g>i2v&obgzIK4f$LTqQ5-hrB6@<_sDmPi7gG+sL5pY; z7|&A;byFj~Oixk+EvCn4J?<+gL|GK1rPM@wX#?%1a@s{Jsg){m-v(|YavNwHWzbvr zpXdR~qbhoc3aN{pA*L{D?4K;AXa^!K)K1OhKz)N&lg(6~^bSfT zJ0jv!$wkgtpN>jyO8PYN04Kc-8XTyQiK_=b1<|DGuROd5&0C^5@M9F4-3MfcUx+%z(3A;I2xnFTlm;w$rMS8fD}fKe zg12FoL>=ZS|2`jb@0J& z7i`(#soiqqjNxq`>CS2BSu_34k>1IQ=0ty?9rfZ*AK>T8Tr6sC)&9bDzMCxjTOaA? z5Bsk%ASOWcN9fS-)cGIS0la64mz{@(SWeUZ>TzTH`}bHlVmh{~<228^b)97<0q=f( zA$*6Ov%KixbNsgdPfo{uVsa4=Tzr?)fLmTV!T!-G%X=pEbnIYs4Yz-s!=C@)={|l7 z)bP-OLCyg0Vz}3+UwqdP-BNEXIK>y1RGBqS9Gl^R;02ab(7g+<;NcneZokG};LF!X zxO)GyruKMjg1_9*V)i6F-J|Y3;y%uyd#C5-7ay-59tuXynQ2X0tJFK3PvO30n>h;p%5TCbkVXB9V%GnLhk${fsk zqXouSSDMXp)X%l{q4!GflI~CH>6q@<%F{8ui;dM+R(-#Eow++w@9)a1JTUUBxx;#2 z^d4DxdS*IDcsi#0{h;U+Z(Nr*q*49n-sR<>|B6-vH|#=>B!@)_(QA=x>zuJ<^)A2LIRH NoNe1@ejCsR{R?|epCJGM diff --git a/packages/models/debris/debris02/tris.md2 b/packages/models/debris/debris02/tris.md2 deleted file mode 100644 index 8fa66c3b3956637471f3d2e73e01c6874221158a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1860 zcmah|eQ1?+6n=K^?%loH{o35U&E0OU&54j&GW?MnZuftD<)4Df2X^EHlB(M;3m@13l|147Z*^5Lu4Pr zY>eYs?7|Fufg1WZV*|{tPY(L%31{ry&;zNkBj|!Po3NssI6d=#X=_9m$Mq;yhgylz$?PoHQS`Kx5 z#D{1j)Cp24%&cgHnT;YBQ|Jd6MY*Y5dJ+0DJZAerMls|u^4cm>iJC&42$k}g&7+2! z6US{EBGXO(aoR8^cheIaCf-9oLF*;MMH{EhU@TpESQ!fsl;1yHB}LtxdkVTE(aP?o z&5avgpZ^RBxDWXfN49X?&ag|>!Hp4?3EXiw*#JV_u}#@3pAc47)p% zGOzB{+21!$ZZ#P{{x&hMdau?NJAXxUMs--bhymt8#}Bl`c9mlQF8>RYgMTl z<2mx56=eQlI6b50IOo;9I{VY}Y7MO|dPl30rtsf^q|CMK_qZuJebx%o_uq(^!qxMw z5Pc`^;>kvHXXZ?MFPbAbU0e6{3Uj3Wt`%`;J8|)zHKzZgbM{^|M{t9mh0I?soGFv< zt9y0!H|pJHe)#Z?{e88D))u{3L6aHXb<&7> zuFhPQw2ibN?H)~~6RS4CJ;gwtw%ZLf<28C|F^nRMTjb8*8a}{}Z#aTq=)eusV+5U; zMg!jPG)2xdl6a307LdYkG~y3ymZ`i9r~cZScM&QWv1*M+*Q97 zWPiGm}OteDy&MdJo+0e>}5u=tb9d7y0wKF)`$DO7#MR3opfmshCtVnN0SHx@R%T zBRlw?x7hYc6b3d)6*p@X&NxP*=l%6ky^g7E*PG3iL{E38^w=~^ZKY?{wJzQjKMI$n zn!}gbrq)E$fK>Cb^UR*i8hd}Hwq4Kc&(turl^!B_5h;aqAIbi(XxRd3G5mAzz9_`K zQvCyV-p%kHvA;R4?_t&`-cmKBr(vspKU3STH=Q`MTuF|g|3>7IZ;doiv|8H3dEt{ zkoZHRkU$6^NTL!olLYty)(>L+Aj}vM6f-a}@rMa8en0|QeC}Oo4sCMI``mlZea^={ zw@)m4Dis2Mo*Bs+%wGj%PC=H^X3Wb9@}2p5fuoe;Wx$s>i7#*%@8M&d<98hA@jHIT z5w1VO6!&i8Q~ZXlIDvgQg;89>eq6%=T&CwvT;$FPyn$aaiQTwObcKA|F@_KDIu7A& zyUB;^A*T;1&wM%h`eT?8TpD42^W9%?doVt!Ij?L6$WU>uX9Ltp8*TdZe zbv?x;_ArZj`iIF=N4uX0)DF-2nU$CMRZ}-mKx}jac>`n&vGRL}Kpdd|z1%UCM3_S( zQPiS3;+|vwwcnA|XZmy9FW#4{^p1VCdi~(=OD(N-j?Daw`8%@NMd?5?kr~bPFW=Vp zEPBQ_RjtTuOVuCwd~xGEJh~xWbAP|v@ZhelA*qqU>b>J{uJm_4HyFkvo$ZOxulr=Qon|+%`*F^ z`S#qY4}0a{#FJub&pRne4`;+*;OpMLKsN1MVb^<_({kgF5wR0B^^ly8ua{uKPxDPy zH_FASPBFc|G%p~n^-ILOIg`f^56_kMZwDnxe4%ZQJQiOk4)NKw9&x&#mq@`c*|tRf z-r}?T|GwHMvAoB|-Mu3tLt|AEEBNW0bgr3oJrW%nur-;uuXXz5{mZY2ORVFL+^Unw z{6;A+@LkWe$c`;xo0IOJ?z!R99Gbhdju(1E^1y|JjjK8IeHuRPr)?{*Ksru075k$5 zsr%fvCnDd!^|-_fb?E!nb=)45$;`V1bU$^UOa1g(^Xc=Z4sFxDEcFYk`O!0> z@6hnA8EulMD+lbn=o)qH#!qu-ZhcS2PtTRkN#|<(^jhEBL@Ft%=2^vg(KdaDrGB~& zoqOqf(>DF4O8xX)=y~bN$0WCZVe!3bo1TeMKmCsM+gbb9W?6MQTbvjDU!n6eeg~SC a7X9>`>U%Tq<6!Ud;yi1c?veK6b>M$gA%vp< diff --git a/packages/models/debris/license.txt b/packages/models/debris/license.txt deleted file mode 100644 index 27cf29e..0000000 --- a/packages/models/debris/license.txt +++ /dev/null @@ -1,100 +0,0 @@ -Description - -=========== - -Files in this folder: - - - -by "makkE" - -Markus Bekel - -e-mail: makk_e@web.de - - - -=================================================================================================== - -These files have been licensed under a the - -"Creative Commons Deed / Attribution Non-commercial Share-Alike ( at-nc-sa )" - -=================================================================================================== - - - -You are free: - - - - * to copy, distribute, display, and perform the work - - * to make derivative works - - - -Under the following conditions: - - - -"by" - - -Attribution. You must give the original author credit. - -"nc" - - -Non-Commercial. You may not use this work for commercial purposes. - -"sa" - - -Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under a licence identical to this one. - - - - * For any reuse or distribution, you must make clear to others the licence terms of this work. - - * Any of these conditions can be waived if you get permission from the copyright holder. - - - -Your fair use and other rights are in no way affected by the above. - - - -This is a human-readable summary of the Legal Code (the full licence). - - - -===================================================================================================== - - - -See: - - - -http://creativecommons.org/licenses/by-nc-sa/2.5/deed.en_GB - - - -for the original "human readable" document. - - - -http://creativecommons.org/licenses/by-nc-sa/2.5/legalcode - - - -for the full legal code. - - - -visit creativecommons.org for general information and translations of the above documents. - - - - - - - diff --git a/packages/models/debris/masks.png b/packages/models/debris/masks.png deleted file mode 100644 index 3b055d475c6704331f027ef2d1b73c4a8d84956a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13155 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 Cf)8~7 diff --git a/packages/models/gibs/gib01/skin.png b/packages/models/gibs/gib01/skin.png deleted file mode 100644 index 69330e93069aa99c67dd7421d8c0916114916c0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6238 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 diff --git a/packages/models/gibs/gib01/tris.md2 b/packages/models/gibs/gib01/tris.md2 deleted file mode 100644 index b597d0026366dc79adac10c2089323c31c4bae9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 600 zcmeZt2{7Vd00Kq`b^x(~fDMRwfEXkf2*e<17bq?P(pP|31SlB6#K6$Q5Xg9&VIjlL z|5F*97*8`8F#h~Mg`tSy0KaxNsYyg zMPkfAc_Z`weYr8B_8`}N+7NBuC#7f)3WMcqc_mEbq@9l=NIl{0jiq^)YAaf12UuKK*7EPm!9nf$${+c zf!YglPd3y&Aay5drR>(c7u?4RWTykoQ-PYd1<5@ib?mE!?SDxv0IPcgG_MP4-V~rc wFQE2-)FJ!BB(=q!&tL`Ezw;fJ*u8une&mgc^35 zpY?B z0DpSrye@u7xI^ZyV(0|`6lYH}=;P$wBLE;S4bU_2*0J=3xqG_VIyhrs-u~_wn5311 z3ji2|7v3_hUXvjY8ogjkrUXq)&7UsyPd{$C(Hrj~CDnk-ynLHi`=Y&kD9!EXM~8Bo z<}aI=zDkmC=-3-?Rhu%ow3w!`?~CIbjp3cdT`hQX#$n>hCq(-Om`f~}!U!L_f=zZqPtWE^yienG12f5_8+DYgeJ_G3%IgH6@QeE!jyfF2uF!9`u$ z=TXP9sYmBpK+nHePv6X-u!p0jUe(`AxaZ#B6&&;uIEkKX%sw>k@|E4!m^Jkv+vg78 z7v4mzq`gz~);9CY$F*|IZJw85D4C9t1L-zDIv96yikg0Ac8@=YbG~jS)Opkk{;KIbb}`G2HzOhcNa_jN+P6bs0Z^w+9S7uF0Sn!#skP}fm8sP0R;hX zrZ&j*(IbWj7iQoRwX(RcGHvZe+rz#bV8^(Uf@fB7g^o{eH*BqZ^l#8`?HXN=cG#z^ z#$_%R*;;(a7~3O-6U(t%L}-#SA!+P>Je6NC>Ip}0@eZT_XYStD(0{qS&12C7X-#(V z^OWb%?iJb-^iImY`f~F8NfwFR!r*ja$mQJ`yhdn(%qz$kpM*a6OT6d!_j&eo#Ac?J zJ+xWlO*6P8`6h*X#_$&o$YH^W0d0~3btEK!ll9y(u=sMVWVZf5sr;?=;o zjrZkVL-8n3d*p#ykGJi^_cEC`9&Z(?s0f5<9zB@}foZNVOx>Ab@=FlIo@h2+@$%bG zV`o3G*wkH&F`gc}CPKOw)|uMA_uP<`J-Q}!{8{Dj5nq!@;4rMFcs0ehMIdD~HNK_o zk}OYoNRb^9z4jv@KJB)9*$XH2MX=ODJ?`t;K_fNsc^qp$UHTh)TDyDGJ_^+2-}0k( z=$ysPl@-V{SjuBsHE+o1SVE{bg4gJB8UxQdnLSu}+jDzRI#xbjmeL}J}9t*Le7MyNX!PQ-gS#~p~qVDvPGdsla5aQ?6aRj|prMb^)! z{qL$7yhgA-tV*N`Cunzrm)Ia^Z`&+SJGa}QV^}DOLQwSJgQ|oSt(_a}7szCkL#dR8 zeX;6190rMpjfa*rQ{vxwK$L>9Wz9cAAN1KgOfpok>m4}er<-4u5oKxx`rbXPU5+d32SJu-_t<`qX_pB`+h4zUBEPaMS^=fOr zt-tsrZ!B1zN@e&2OD?r0Y*`E@3eSBpMXN_$Xuq6c`z{Py8E#xCz}6Ke9$IFA!A+{U zSn$T~%HqbvlONkkW_+^lzSM=@WSZX<6l)LSSAO6roevqc-G1`OSyf09`@v4G3cs_n zt~k$XbHx`g)SY5Y86@X8ZTK$r;odgb{?eCThJAB~&y4jk_%0X#fT#a))%J672LSt! z4Xm2y0*o?ZKg%jUm^X3DWBtu~kz=aY(GSer4PX8hrVE&lTUG-zpJfV zI-HlJjg2J3BPxaB(p`j|JAFYqMGw|SOVbcibmrVlb{0aWjX2&muQe&Eeje*r8p)G+ zlcjrJs#l&7V~o5r5{~4M83~`?V_2A^oaz_SA(slM#@+V_-Wj~srWiY~NWqukF$h|P zG{3d=XSU)FGGMih~Sgb_Vk^VhS9Tgks{?6tLa-rku2?oq&n=>(1SWx zC*jQe-iisXS}Nb40|+zgcwsq=_yXkB>vJ^wy5BW zUJb0kNTUzqPredwJT7D+z?)V3Lh|x+*|Vz2oszQCALmW#VjATG zn=sN!P8;~_feUJyrOu_HRC><&h|G(Cs=BoVx0Nt{7l< z%6LC$^s_}mOzwNp)3yPOm02aB`hH=8Wt>}hNOpYpc$#y3Kd5h+Xai?$TWK%Hfeb_+ ze&s-}eO2H%(T}MfGru0cKArJhj(h(M30guHjh8Jae6@hwJa6cMKIHjg0RW1;t|+gk z@|JhRFu~-l4=_`sKVtgI?M!iGuL^>fxQh02h^5>D>SRNSk_Va$i|1~w($F?RCv{96 zis<{if2Ytaw>?{Fy>9i&!RUz{ANg}Bv$yL3e0)Q&f(4cfAhmFdtpwXL{scMXk^30S zM;ffuCAtyR?YzZ`Bm+c7Zh@0_F^rQ>Sq#iADgk*bKzZMY83xNMsS=RnqOp9i9r~WB zpfxF^Qcc7tIZWu&Q)#BE(x_~wyH6Wb7x@K083nhh37nn{OUX+U?d!_h9V`KVw@!NTvCWq{{fG#!FQQi;}5 zDK(WSGNn!whRCM_URnF#fY{IJX}#|_CS4RR_T>&QUb=T&qt6k+z%6F+!L8nOJZOL0 zMGMUX6B!9kME9vT>ACyrlNMdIC>r_VF*puoy^7Y`nY}#`;mVfjU2`)36>l+uU-8Au zI7{?up4pcC+$7VXG&mM2^khe8K=^YyQ=XAgN0^CT;lb|Rz|cYBh}4okCu*YN;*Q&a zUWYHzra#;)WShz=Vv6kLIN80IkT0y!Vl08bb4N0qoJy)hyIlUQJx)g@&tz*y)M!@x>jdjJ_AQ-e*J3R9B}+|qpW$ON~BV*2}ghBNrK2R0D>@< zGmz1uAHR&=6oIy9?`FOA3dYtxjpD|#fcxf;e(c)OyrEYWbeWi<%w)Eneo^9dCT-WC ztOk~(VnNL?$s7#@*$B5iCm~htGkYO$XIh-XY-Arde@@}y`0lJ$u@{Pz>`?R2_mX+P zzx@8T-}0eIQ9-HcsBy?(f8SstRaEPFbehys;ak{wQ~_fH8SU;>KboAG+LywvdKV*MSG7zkAy0aaEVHM~MX*jW z54cQroH=cVD%P5RtlHssD)IFxO=kOR%`I%7Xs@On9qhfQ5*h?+4RWjTa7M<6_`+SW zx3NVZw3I-oz|N3NedAh@hF46*E1nlE%%`RU>-URgb3S!kp*=dvbbD2Qd^ATYxn4FR zAU}e81xXbEQ4vQ)%n>D~1!Ps&mGv~4xi#P289AQkS0AqUIlH-+9NW3I$Ru}oaPsy% zO=da^0)VKS3Tc>>Ua+30t1qcByHaFQJ8ZPcG3hFF z$$zEJ`*(d^~~;PFDk{PuF`tAiyQl$eYtz3BSiin zqWf2&b-_+ncNt#cN|zL2t3m=fo@#7UE< zmd%t^hRk@FE7*$q0P(olhf*ecyVeEPrn~2dx8}7s;DRkD8`Nj!P86xt9t{1cZea|L zeMGAs&R3n3^XUT0qdYuEtVG{O2ovg2c8r;-GtHd5R2b3UkMUieSTgEKbGg8l(1?L$ zi*LwQh*%$5=B%Xn7Qg1E(Y;1F65>I!gcB5xPttnF+jAR5nQOR8d5y&+ISJpzloByek&>KF_C3x7>!rw}GIvG@(%q@A$&&Xn>$$hxav7tdUNJ z*QT>8(h67Qj^>!s3Y!AA!BoT!eT$xw*8Lm(tA1m%iDs_@J0dx{f~8O|z$>`D9ipK2RQU&euc@wsJ^B_*s-O*c@UK`ms2$=S? zyEgWsnz#FYzPz$_t#S1*@|Y9ntPdwgc~pECOBfQn9;ZE__olE9Nxo=A)+I%-qjOZ?u`g(_G9J8u?+HJFACMW=)sH@+B^?(mvoru zI0ix3{ z48jF~&H==~+5lh$V*TBA1PT0!AsoYi;K1o&3_T%xf)Kyk5s?l64Q@h|-#_W#rm2L0Oyh!6bRH<%FVSNfY~{1|=)pix!2 zt^|MxJeAWC;Wq%vUt=*>&;Y>rO@R7W53mU)@Im+qAPk^{LZM_(N-{D^S_*OsT81-} zlxG;2>F5~f=$L6Kf2BXGKRW+if~Y7csHmxEsHth_si~>yPYY`LKPa^S9|!nWfEG$P zIfD^_xBxIMh=>-1pCk+$jPC@=5mXX`ex+XnCQLVBa1de=QYaZY1>rIHyAcF{iT-V* zA?)fPA}|C@OiBVJCZa?VjI=}$&a-f0d2LHNE{_ld34K!T^K0BZ3_5LANHNd*g9@a) z$+}y!+tywv#=PoKKE;Q6Ht6n)r;AagB$=e)yocQ~b)$?beCa*X7;^sI~<> zVCU9=ZVWJTO%r1I-tf$+YofpvES?(e6O_Xwi9nHdA)oBU#qKcQe*Qs(Tbnh`QSQ-? zchj>-wh!J>dYD{UbNs-JLsh_rS2qCV&z@$GF=kV#-#Vy%HC=na)MebVrO#BQw*$;; zVhut4T~FQDBW0efibkMX_U6swiiR6^6rwk)nE{aKcM24M+SzxcR)I zf@yyN%#-{JBXwnTwEGShy(wFQ@EE)SjGT`Qx3+@!B$$q&DqUU*WJ<@ z1BjzgNE9*w1aGch4sNah5)t*xj_LnG4F40NFWsE{H$}Q`w%)#$o*3XCRz-H3%xD7m z{O^$7_C79Fu9gnYgpsD)mYKKvB z^K`NF1`twWLCWlm1dhl*`2I(ZI>yz`+a8b*mtZX2BpkQ{9RI-7!Fahj`*;&(L*Lbb z5Qg`v+0g%h8vKO?BoLS2CGAxXUs3|Ezn|DpbrW6dCg;ASG!+r?~D{vuEiI5P2 zOc;oQfkw0qQC>p{MdYH*M2o1EAg)@t6QAFC?+KSKobP@2-S3?9opZkB;)x`9R2W&| zJo3+Bq!^DG^4t%OfQndxQf#3+iwYHCg507?P?Q$^h|;3Z z5M>%g4rV8*i}7Z2HboXEma%3jQggkT&G^z$UvS4)3QwGgk2iX+-R({vM-EU8w;Y#oTdABA$sKrCwYPH_~eb$p59&Wv@ z|Ng1Zkg_-Mb7a^pUpVX9K`rsoQ4ci>|8uz0MuE9C+&dF{T%Om22rcv3OJWJ#W&oE79HK9DAcV%w7kL znM9Xl{e0xl)S3CBvtAUvLzA^Zebe8x;ahZf*mqCV_ZWBfHQJf@dt~^NeQv&)GmTUC k(9oHlDlUC+ix*~s-5&UF4(IbH-BcWy7Z2uM%-Vdy27Y_3i~s-t diff --git a/packages/models/gibs/gib03/skin.png b/packages/models/gibs/gib03/skin.png deleted file mode 100644 index 48cb2f9b4221caeee36892c22f91cb09b9735587..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9476 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 diff --git a/packages/models/gibs/gib03/tris.md2 b/packages/models/gibs/gib03/tris.md2 deleted file mode 100644 index e5720e66eb47a21c6e748ede6560ab6ef5ce0b17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4988 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 PFneR|Bf!kv;NbrQtJE=Q literal 0 HcmV?d00001 diff --git a/packages/models/health/model.md3 b/packages/models/health/model.md3 deleted file mode 100644 index 06419c944320e53db4b6056b738888a55cc9aa15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11732 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 i{#;aKy~O+VMfTx*x%id); - if(hit || overlaid) gle::color(vec(vslot.glowcolor).mul(color)); - else gle::color(vslot.glowcolor); - gle::begin(GL_TRIANGLE_STRIP); - gle::attribf(x, y); gle::attrib(tc[0]); - gle::attribf(x+xs, y); gle::attrib(tc[1]); - gle::attribf(x, y+ys); gle::attrib(tc[3]); - gle::attribf(x+xs, y+ys); gle::attrib(tc[2]); - gle::end(); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } if(layertex) { glBindTexture(GL_TEXTURE_2D, layertex->id); diff --git a/src/engine/animmodel.h b/src/engine/animmodel.h index a7ed257..13705f4 100644 --- a/src/engine/animmodel.h +++ b/src/engine/animmodel.h @@ -68,9 +68,9 @@ struct animmodel : model struct shaderparams { - float spec, ambient, fullbright, envmapmin, envmapmax, scrollu, scrollv, alphatest; + float spec, ambient, fullbright, scrollu, scrollv, alphatest; - shaderparams() : spec(1.0f), ambient(0.3f), fullbright(0), envmapmin(0), envmapmax(0), scrollu(0), scrollv(0), alphatest(0.9f) {} + shaderparams() : spec(1.0f), ambient(0.3f), fullbright(0), scrollu(0), scrollv(0), alphatest(0.9f) {} }; struct shaderparamskey @@ -105,15 +105,14 @@ struct animmodel : model struct skin : shaderparams { part *owner; - Texture *tex, *masks, *envmap, *normalmap; + Texture *tex, *masks, *normalmap; Shader *shader; bool alphablend, cullface; shaderparamskey *key; - skin() : owner(0), tex(notexture), masks(notexture), envmap(NULL), normalmap(NULL), shader(NULL), alphablend(true), cullface(true), key(NULL) {} + skin() : owner(0), tex(notexture), masks(notexture), normalmap(NULL), shader(NULL), alphablend(true), cullface(true), key(NULL) {} bool masked() const { return masks != notexture; } - bool envmapped() { return envmapmax>0 && envmapmodels; } bool bumpmapped() { return normalmap && bumpmodels; } bool tangents() { return bumpmapped(); } bool alphatested() const { return alphatest > 0 && tex->type&Texture::ALPHA; } @@ -152,15 +151,7 @@ struct animmodel : model minshade = scale*max(ambient, mincolor); LOCALPARAMF(lightscale, scale - minshade, scale, minshade + bias); } - float curglow = glow; - if(glowpulse > 0) - { - float curpulse = lastmillis*glowpulse; - curpulse -= floor(curpulse); - curglow += glowdelta*2*fabs(curpulse - 0.5f); - } LOCALPARAMF(texscroll, scrollu*lastmillis/1000.0f, scrollv*lastmillis/1000.0f); - if(envmapped()) LOCALPARAMF(envmapscale, envmapmin-envmapmax, envmapmax); } Shader *loadshader() @@ -180,7 +171,6 @@ struct animmodel : model if(alphatested()) opts[optslen++] = 'a'; if(owner->tangents()) opts[optslen++] = 'q'; if(bumpmapped()) opts[optslen++] = 'n'; - if(envmapped()) opts[optslen++] = 'e'; if(masked()) opts[optslen++] = 'm'; if(!fullbright && (masked() || spec>=0.01f)) opts[optslen++] = 's'; opts[optslen++] = '\0'; @@ -259,17 +249,6 @@ struct animmodel : model glBindTexture(GL_TEXTURE_2D, masks->id); lastmasks = masks; } - if(envmapped()) - { - GLuint emtex = envmap ? envmap->id : closestenvmaptex; - if(lastenvmaptex!=emtex) - { - glActiveTexture_(GL_TEXTURE2); - activetmu = 2; - glBindTexture(GL_TEXTURE_CUBE_MAP, emtex); - lastenvmaptex = emtex; - } - } if(activetmu != 0) glActiveTexture_(GL_TEXTURE0); } }; @@ -314,8 +293,7 @@ struct animmodel : model virtual void setshader(Shader *s) { - if(glaring) s->setvariant(0, 1); - else s->set(); + s->set(); } template void smoothnorms(V *verts, int numverts, T *tris, int numtris, float limit, bool areaweight) @@ -716,12 +694,6 @@ struct animmodel : model } } - bool envmapped() - { - loopv(skins) if(skins[i].envmapped()) return true; - return false; - } - bool tangents() { loopv(skins) if(skins[i].tangents()) return true; @@ -902,8 +874,6 @@ struct animmodel : model if(!(anim&ANIM_NOSKIN)) { - if(envmapped()) GLOBALPARAM(modelworld, matrix3(matrixstack[matrixpos])); - vec odir, ocampos; matrixstack[matrixpos].transposedtransformnormal(lightdir, odir); GLOBALPARAM(lightdir, odir); @@ -1077,14 +1047,6 @@ struct animmodel : model transparent = trans; lightdir = dir; lightcolor = color; - - if(envmapped()) - { - setupenvmap: - closestenvmaptex = lookupenvmap(closestenvmap(o)); - GLOBALPARAM(lightdirworld, dir); - } - else if(a) for(int i = 0; a[i].tag; i++) if(a[i].m && a[i].m->envmapped()) goto setupenvmap; } if(depthoffset && !enabledepthoffset) @@ -1104,7 +1066,7 @@ struct animmodel : model { glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); render(anim|ANIM_NOSKIN, basetime, basetime2, pitch, axis, forward, d, a); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, fading ? GL_FALSE : GL_TRUE); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glDepthFunc(GL_LEQUAL); } @@ -1196,12 +1158,6 @@ struct animmodel : model return parts[0]->unlink(p); } - bool envmapped() - { - loopv(parts) if(parts[i]->envmapped()) return true; - return false; - } - virtual bool flipy() const { return false; } virtual bool loadconfig() { return false; } virtual bool loaddefaultparts() { return false; } @@ -1241,21 +1197,6 @@ struct animmodel : model loopv(parts) loopvj(parts[i]->skins) parts[i]->skins[j].shader = shader; } - void setenvmap(float envmapmin, float envmapmax, Texture *envmap) - { - if(parts.empty()) loaddefaultparts(); - loopv(parts) loopvj(parts[i]->skins) - { - skin &s = parts[i]->skins[j]; - if(envmapmax) - { - s.envmapmin = envmapmin; - s.envmapmax = envmapmax; - } - if(envmap) s.envmap = envmap; - } - } - void setspec(float spec) { if(parts.empty()) loaddefaultparts(); @@ -1316,7 +1257,7 @@ struct animmodel : model static bool enabletc, enablealphablend, enablecullface, enablenormals, enabletangents, enablebones, enabledepthoffset; static vec lightdir, lightcolor; static float transparent, lastalphatest; - static GLuint lastvbuf, lasttcbuf, lastnbuf, lastxbuf, lastbbuf, lastebuf, lastenvmaptex, closestenvmaptex; + static GLuint lastvbuf, lasttcbuf, lastnbuf, lastxbuf, lastbbuf, lastebuf; static Texture *lasttex, *lastmasks, *lastnormalmap; static int matrixpos; static matrix4 matrixstack[64]; @@ -1326,7 +1267,7 @@ struct animmodel : model enabletc = enablealphablend = enablenormals = enabletangents = enablebones = enabledepthoffset = false; enablecullface = true; lastalphatest = -1; - lastvbuf = lasttcbuf = lastxbuf = lastnbuf = lastbbuf = lastebuf = lastenvmaptex = closestenvmaptex = 0; + lastvbuf = lasttcbuf = lastxbuf = lastnbuf = lastbbuf = lastebuf = 0; lasttex = lastmasks = lastnormalmap = NULL; transparent = 1; shaderparamskey::invalidate(); @@ -1387,7 +1328,7 @@ bool animmodel::enabletc = false, animmodel::enablealphablend = false, vec animmodel::lightdir(0, 0, 1), animmodel::lightcolor(1, 1, 1); float animmodel::transparent = 1, animmodel::lastalphatest = -1; GLuint animmodel::lastvbuf = 0, animmodel::lasttcbuf = 0, animmodel::lastnbuf = 0, animmodel::lastxbuf = 0, animmodel::lastbbuf = 0, - animmodel::lastebuf = 0, animmodel::lastenvmaptex = 0, animmodel::closestenvmaptex = 0; + animmodel::lastebuf = 0; Texture *animmodel::lasttex = NULL, *animmodel::lastmasks = NULL, *animmodel::lastnormalmap = NULL; int animmodel::matrixpos = 0; matrix4 animmodel::matrixstack[64]; @@ -1468,14 +1409,12 @@ template struct modelcommands #define loopskins(meshname, s, body) loopmeshes(meshname, m, { skin &s = mdl.skins[i]; body; }) static void setskin(char *meshname, char *tex, char *masks, float *envmapmax, float *envmapmin) - { + {(void)envmapmax;(void)envmapmin; loopskins(meshname, s, s.tex = textureload(makerelpath(MDL::dir, tex), 0, true, false); if(*masks) { s.masks = textureload(makerelpath(MDL::dir, masks), 0, true, false); - s.envmapmax = *envmapmax; - s.envmapmin = *envmapmin; } ); } diff --git a/src/engine/blend.cpp b/src/engine/blend.cpp deleted file mode 100644 index 4d83ef6..0000000 --- a/src/engine/blend.cpp +++ /dev/null @@ -1,862 +0,0 @@ -#include "engine.h" - -enum -{ - BM_BRANCH = 0, - BM_SOLID, - BM_IMAGE -}; - -struct BlendMapBranch; -struct BlendMapSolid; -struct BlendMapImage; - -struct BlendMapNode -{ - union - { - BlendMapBranch *branch; - BlendMapSolid *solid; - BlendMapImage *image; - }; - - void cleanup(int type); - void splitsolid(uchar &type, uchar val); -}; - -struct BlendMapBranch -{ - uchar type[4]; - BlendMapNode children[4]; - - ~BlendMapBranch() - { - loopi(4) children[i].cleanup(type[i]); - } - - uchar shrink(BlendMapNode &child, int quadrant); -}; - -struct BlendMapSolid -{ - uchar val; - - BlendMapSolid(uchar val) : val(val) {} -}; - -#define BM_SCALE 1 -#define BM_IMAGE_SIZE 64 - -struct BlendMapImage -{ - uchar data[BM_IMAGE_SIZE*BM_IMAGE_SIZE]; -}; - -void BlendMapNode::cleanup(int type) -{ - switch(type) - { - case BM_BRANCH: delete branch; break; - case BM_IMAGE: delete image; break; - } -} - -#define DEFBMSOLIDS(n) n, n+1, n+2, n+3, n+4, n+5, n+6, n+7, n+8, n+9, n+10, n+11, n+12, n+13, n+14, n+15 - -static BlendMapSolid bmsolids[256] = -{ - DEFBMSOLIDS(0x00), DEFBMSOLIDS(0x10), DEFBMSOLIDS(0x20), DEFBMSOLIDS(0x30), - DEFBMSOLIDS(0x40), DEFBMSOLIDS(0x50), DEFBMSOLIDS(0x60), DEFBMSOLIDS(0x70), - DEFBMSOLIDS(0x80), DEFBMSOLIDS(0x90), DEFBMSOLIDS(0xA0), DEFBMSOLIDS(0xB0), - DEFBMSOLIDS(0xC0), DEFBMSOLIDS(0xD0), DEFBMSOLIDS(0xE0), DEFBMSOLIDS(0xF0), -}; - -void BlendMapNode::splitsolid(uchar &type, uchar val) -{ - cleanup(type); - type = BM_BRANCH; - branch = new BlendMapBranch; - loopi(4) - { - branch->type[i] = BM_SOLID; - branch->children[i].solid = &bmsolids[val]; - } -} - -uchar BlendMapBranch::shrink(BlendMapNode &child, int quadrant) -{ - uchar childtype = type[quadrant]; - child = children[quadrant]; - type[quadrant] = BM_SOLID; - children[quadrant].solid = &bmsolids[0]; - return childtype; -} - -struct BlendMapRoot : BlendMapNode -{ - uchar type; - - BlendMapRoot() : type(BM_SOLID) { solid = &bmsolids[0xFF]; } - BlendMapRoot(uchar type, const BlendMapNode &node) : BlendMapNode(node), type(type) {} - - void cleanup() { BlendMapNode::cleanup(type); } - - void shrink(int quadrant) - { - if(type == BM_BRANCH) - { - BlendMapRoot oldroot = *this; - type = branch->shrink(*this, quadrant); - oldroot.cleanup(); - } - } -}; - -static BlendMapRoot blendmap; - -struct BlendMapCache -{ - BlendMapRoot node; - int scale; - ivec2 origin; -}; - -BlendMapCache *newblendmapcache() { return new BlendMapCache; } - -void freeblendmapcache(BlendMapCache *&cache) { delete cache; cache = NULL; } - -bool setblendmaporigin(BlendMapCache *cache, const ivec &o, int size) -{ - if(blendmap.type!=BM_BRANCH) - { - cache->node = blendmap; - cache->scale = worldscale-BM_SCALE; - cache->origin = ivec2(0, 0); - return cache->node.solid!=&bmsolids[0xFF]; - } - - BlendMapBranch *bm = blendmap.branch; - int bmscale = worldscale-BM_SCALE, bmsize = 1<>BM_SCALE, y = o.y>>BM_SCALE, - x1 = max(x-1, 0), y1 = max(y-1, 0), - x2 = min(((o.x + size + (1<>BM_SCALE) + 1, bmsize), - y2 = min(((o.y + size + (1<>BM_SCALE) + 1, bmsize), - diff = (x1^x2)|(y1^y2); - if(diff < bmsize) while(!(diff&(1<<(bmscale-1)))) - { - bmscale--; - int n = (((y1>>bmscale)&1)<<1) | ((x1>>bmscale)&1); - if(bm->type[n]!=BM_BRANCH) - { - cache->node = BlendMapRoot(bm->type[n], bm->children[n]); - cache->scale = bmscale; - cache->origin = ivec2(x1&(~0U<node.solid!=&bmsolids[0xFF]; - } - bm = bm->children[n].branch; - } - - cache->node.type = BM_BRANCH; - cache->node.branch = bm; - cache->scale = bmscale; - cache->origin = ivec2(x1&(~0U<node.solid!=&bmsolids[0xFF]; -} - -static uchar lookupblendmap(int x, int y, BlendMapBranch *bm, int bmscale) -{ - for(;;) - { - bmscale--; - int n = (((y>>bmscale)&1)<<1) | ((x>>bmscale)&1); - switch(bm->type[n]) - { - case BM_SOLID: return bm->children[n].solid->val; - case BM_IMAGE: return bm->children[n].image->data[(y&((1<children[n].branch; - } -} - -uchar lookupblendmap(BlendMapCache *cache, const vec &pos) -{ - if(cache->node.type==BM_SOLID) return cache->node.solid->val; - - uchar vals[4], *val = vals; - float bx = pos.x/(1<origin.x, ry = iy-cache->origin.y; - loop(vy, 2) loop(vx, 2) - { - int cx = clamp(rx+vx, 0, (1<scale)-1), cy = clamp(ry+vy, 0, (1<scale)-1); - if(cache->node.type==BM_IMAGE) - *val++ = cache->node.image->data[cy*BM_IMAGE_SIZE + cx]; - else *val++ = lookupblendmap(cx, cy, cache->node.branch, cache->scale); - } - float fx = bx - ix, fy = by - iy; - return uchar((1-fy)*((1-fx)*vals[0] + fx*vals[1]) + - fy*((1-fx)*vals[2] + fx*vals[3])); -} - -static void fillblendmap(uchar &type, BlendMapNode &node, int size, uchar val, int x1, int y1, int x2, int y2) -{ - if(max(x1, y1) <= 0 && min(x2, y2) >= size) - { - node.cleanup(type); - type = BM_SOLID; - node.solid = &bmsolids[val]; - return; - } - - if(type==BM_BRANCH) - { - size /= 2; - if(y1 < size) - { - if(x1 < size) fillblendmap(node.branch->type[0], node.branch->children[0], size, val, - x1, y1, min(x2, size), min(y2, size)); - if(x2 > size) fillblendmap(node.branch->type[1], node.branch->children[1], size, val, - max(x1-size, 0), y1, x2-size, min(y2, size)); - } - if(y2 > size) - { - if(x1 < size) fillblendmap(node.branch->type[2], node.branch->children[2], size, val, - x1, max(y1-size, 0), min(x2, size), y2-size); - if(x2 > size) fillblendmap(node.branch->type[3], node.branch->children[3], size, val, - max(x1-size, 0), max(y1-size, 0), x2-size, y2-size); - } - loopi(4) if(node.branch->type[i]!=BM_SOLID || node.branch->children[i].solid->val!=val) return; - node.cleanup(type); - type = BM_SOLID; - node.solid = &bmsolids[val]; - return; - } - else if(type==BM_SOLID) - { - uchar oldval = node.solid->val; - if(oldval==val) return; - - if(size > BM_IMAGE_SIZE) - { - node.splitsolid(type, oldval); - fillblendmap(type, node, size, val, x1, y1, x2, y2); - return; - } - - type = BM_IMAGE; - node.image = new BlendMapImage; - memset(node.image->data, oldval, sizeof(node.image->data)); - } - - uchar *dst = &node.image->data[y1*BM_IMAGE_SIZE + x1]; - loopi(y2-y1) - { - memset(dst, val, x2-x1); - dst += BM_IMAGE_SIZE; - } -} - -void fillblendmap(int x, int y, int w, int h, uchar val) -{ - int bmsize = worldsize>>BM_SCALE, - x1 = clamp(x, 0, bmsize), - y1 = clamp(y, 0, bmsize), - x2 = clamp(x+w, 0, bmsize), - y2 = clamp(y+h, 0, bmsize); - if(max(x1, y1) >= bmsize || min(x2, y2) <= 0 || x1>=x2 || y1>=y2) return; - fillblendmap(blendmap.type, blendmap, bmsize, val, x1, y1, x2, y2); -} - -static void invertblendmap(uchar &type, BlendMapNode &node, int size, int x1, int y1, int x2, int y2) -{ - if(type==BM_BRANCH) - { - size /= 2; - if(y1 < size) - { - if(x1 < size) invertblendmap(node.branch->type[0], node.branch->children[0], size, - x1, y1, min(x2, size), min(y2, size)); - if(x2 > size) invertblendmap(node.branch->type[1], node.branch->children[1], size, - max(x1-size, 0), y1, x2-size, min(y2, size)); - } - if(y2 > size) - { - if(x1 < size) invertblendmap(node.branch->type[2], node.branch->children[2], size, - x1, max(y1-size, 0), min(x2, size), y2-size); - if(x2 > size) invertblendmap(node.branch->type[3], node.branch->children[3], size, - max(x1-size, 0), max(y1-size, 0), x2-size, y2-size); - } - return; - } - else if(type==BM_SOLID) - { - fillblendmap(type, node, size, 255-node.solid->val, x1, y1, x2, y2); - } - else if(type==BM_IMAGE) - { - uchar *dst = &node.image->data[y1*BM_IMAGE_SIZE + x1]; - loopi(y2-y1) - { - loopj(x2-x1) dst[j] = 255-dst[j]; - dst += BM_IMAGE_SIZE; - } - } -} - -void invertblendmap(int x, int y, int w, int h) -{ - int bmsize = worldsize>>BM_SCALE, - x1 = clamp(x, 0, bmsize), - y1 = clamp(y, 0, bmsize), - x2 = clamp(x+w, 0, bmsize), - y2 = clamp(y+h, 0, bmsize); - if(max(x1, y1) >= bmsize || min(x2, y2) <= 0 || x1>=x2 || y1>=y2) return; - invertblendmap(blendmap.type, blendmap, bmsize, x1, y1, x2, y2); -} - -static void optimizeblendmap(uchar &type, BlendMapNode &node) -{ - switch(type) - { - case BM_IMAGE: - { - uint val = node.image->data[0]; - val |= val<<8; - val |= val<<16; - for(uint *data = (uint *)node.image->data, *end = &data[sizeof(node.image->data)/sizeof(uint)]; data < end; data++) - if(*data != val) return; - node.cleanup(type); - type = BM_SOLID; - node.solid = &bmsolids[val&0xFF]; - break; - } - case BM_BRANCH: - { - loopi(4) optimizeblendmap(node.branch->type[i], node.branch->children[i]); - if(node.branch->type[3]!=BM_SOLID) return; - uint val = node.branch->children[3].solid->val; - loopi(3) if(node.branch->type[i]!=BM_SOLID || node.branch->children[i].solid->val != val) return; - node.cleanup(type); - type = BM_SOLID; - node.solid = &bmsolids[val]; - break; - } - } -} - -void optimizeblendmap() -{ - optimizeblendmap(blendmap.type, blendmap); -} - -VARF(blendpaintmode, 0, 0, 5, -{ - if(!blendpaintmode) stoppaintblendmap(); -}); - -static void blitblendmap(uchar &type, BlendMapNode &node, int bmx, int bmy, int bmsize, uchar *src, int sx, int sy, int sw, int sh, int smode) -{ - if(type==BM_BRANCH) - { - bmsize /= 2; - if(sy < bmy + bmsize) - { - if(sx < bmx + bmsize) blitblendmap(node.branch->type[0], node.branch->children[0], bmx, bmy, bmsize, src, sx, sy, sw, sh, smode); - if(sx + sw > bmx + bmsize) blitblendmap(node.branch->type[1], node.branch->children[1], bmx+bmsize, bmy, bmsize, src, sx, sy, sw, sh, smode); - } - if(sy + sh > bmy + bmsize) - { - if(sx < bmx + bmsize) blitblendmap(node.branch->type[2], node.branch->children[2], bmx, bmy+bmsize, bmsize, src, sx, sy, sw, sh, smode); - if(sx + sw > bmx + bmsize) blitblendmap(node.branch->type[3], node.branch->children[3], bmx+bmsize, bmy+bmsize, bmsize, src, sx, sy, sw, sh, smode); - } - return; - } - if(type==BM_SOLID) - { - uchar val = node.solid->val; - if(bmsize > BM_IMAGE_SIZE) - { - node.splitsolid(type, val); - blitblendmap(type, node, bmx, bmy, bmsize, src, sx, sy, sw, sh, smode); - return; - } - - type = BM_IMAGE; - node.image = new BlendMapImage; - memset(node.image->data, val, sizeof(node.image->data)); - } - - int x1 = clamp(sx - bmx, 0, bmsize), y1 = clamp(sy - bmy, 0, bmsize), - x2 = clamp(sx+sw - bmx, 0, bmsize), y2 = clamp(sy+sh - bmy, 0, bmsize); - uchar *dst = &node.image->data[y1*BM_IMAGE_SIZE + x1]; - src += max(bmy - sy, 0)*sw + max(bmx - sx, 0); - loopi(y2-y1) - { - switch(smode) - { - case 1: - memcpy(dst, src, x2 - x1); - break; - - case 2: - loopi(x2 - x1) dst[i] = min(dst[i], src[i]); - break; - - case 3: - loopi(x2 - x1) dst[i] = max(dst[i], src[i]); - break; - - case 4: - loopi(x2 - x1) dst[i] = min(dst[i], uchar(0xFF - src[i])); - break; - - case 5: - loopi(x2 - x1) dst[i] = max(dst[i], uchar(0xFF - src[i])); - break; - } - dst += BM_IMAGE_SIZE; - src += sw; - } -} - -void blitblendmap(uchar *src, int sx, int sy, int sw, int sh, int smode) -{ - int bmsize = worldsize>>BM_SCALE; - if(max(sx, sy) >= bmsize || min(sx+sw, sy+sh) <= 0 || min(sw, sh) <= 0) return; - blitblendmap(blendmap.type, blendmap, 0, 0, bmsize, src, sx, sy, sw, sh, smode); -} - -void resetblendmap() -{ - blendmap.cleanup(); - blendmap.type = BM_SOLID; - blendmap.solid = &bmsolids[0xFF]; -} - -void enlargeblendmap() -{ - if(blendmap.type == BM_SOLID) return; - BlendMapBranch *branch = new BlendMapBranch; - branch->type[0] = blendmap.type; - branch->children[0] = blendmap; - loopi(3) - { - branch->type[i+1] = BM_SOLID; - branch->children[i+1].solid = &bmsolids[0xFF]; - } - blendmap.type = BM_BRANCH; - blendmap.branch = branch; -} - -void shrinkblendmap(int octant) -{ - blendmap.shrink(octant&3); -} - -void moveblendmap(uchar type, BlendMapNode &node, int size, int x, int y, int dx, int dy) -{ - if(type == BM_BRANCH) - { - size /= 2; - moveblendmap(node.branch->type[0], node.branch->children[0], size, x, y, dx, dy); - moveblendmap(node.branch->type[1], node.branch->children[1], size, x + size, y, dx, dy); - moveblendmap(node.branch->type[2], node.branch->children[2], size, x, y + size, dx, dy); - moveblendmap(node.branch->type[3], node.branch->children[3], size, x + size, y + size, dx, dy); - return; - } - else if(type == BM_SOLID) - { - fillblendmap(x+dx, y+dy, size, size, node.solid->val); - } - else if(type == BM_IMAGE) - { - blitblendmap(node.image->data, x+dx, y+dy, size, size, 1); - } -} - -void moveblendmap(int dx, int dy) -{ - BlendMapRoot old = blendmap; - blendmap.type = BM_SOLID; - blendmap.solid = &bmsolids[0xFF]; - moveblendmap(old.type, old, worldsize>>BM_SCALE, 0, 0, dx, dy); - old.cleanup(); -} - -struct BlendBrush -{ - char *name; - int w, h; - uchar *data; - GLuint tex; - - BlendBrush(const char *name, int w, int h) : - name(newstring(name)), w(w), h(h), data(new uchar[w*h]), tex(0) - {} - - ~BlendBrush() - { - cleanup(); - delete[] name; - if(data) delete[] data; - } - - void cleanup() - { - if(tex) { glDeleteTextures(1, &tex); tex = 0; } - } - - void gentex() - { - if(!tex) glGenTextures(1, &tex); - uchar *buf = new uchar[2*w*h]; - uchar *dst = buf, *src = data; - loopi(h) - { - loopj(w) *dst++ = 255 - *src++; - } - createtexture(tex, w, h, buf, 3, 1, hasTRG ? GL_R8 : GL_LUMINANCE8); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); - GLfloat border[4] = { 0, 0, 0, 0 }; - glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border); - delete[] buf; - } - - void reorient(bool flipx, bool flipy, bool swapxy) - { - uchar *rdata = new uchar[w*h]; - int stridex = 1, stridey = 1; - if(swapxy) stridex *= h; else stridey *= w; - uchar *src = data, *dst = rdata; - if(flipx) { dst += (w-1)*stridex; stridex = -stridex; } - if(flipy) { dst += (h-1)*stridey; stridey = -stridey; } - loopi(h) - { - uchar *curdst = dst; - loopj(w) - { - *curdst = *src++; - curdst += stridex; - } - dst += stridey; - } - if(swapxy) swap(w, h); - delete[] data; - data = rdata; - if(tex) gentex(); - } -}; - -static vector brushes; -static int curbrush = -1; - -void cleanupblendmap() -{ - loopv(brushes) brushes[i]->cleanup(); -} - -void clearblendbrushes() -{ - while(brushes.length()) delete brushes.pop(); - curbrush = -1; -} - -void delblendbrush(const char *name) -{ - loopv(brushes) if(!strcmp(brushes[i]->name, name)) - { - delete brushes[i]; - brushes.remove(i--); - } - curbrush = brushes.empty() ? -1 : clamp(curbrush, 0, brushes.length()-1); -} - -void addblendbrush(const char *name, const char *imgname) -{ - delblendbrush(name); - - ImageData s; - if(!loadimage(imgname, s)) { conoutf(CON_ERROR, "could not load blend brush image %s", imgname); return; } - if(max(s.w, s.h) > (1<<12)) - { - conoutf(CON_ERROR, "blend brush image size exceeded %dx%d pixels: %s", 1<<12, 1<<12, imgname); - return; - } - - BlendBrush *brush = new BlendBrush(name, s.w, s.h); - - uchar *dst = brush->data, *srcrow = s.data; - loopi(s.h) - { - for(uchar *src = srcrow, *end = &srcrow[s.w*s.bpp]; src < end; src += s.bpp) - *dst++ = src[0]; - srcrow += s.pitch; - } - - brushes.add(brush); - if(curbrush < 0) curbrush = 0; - else if(curbrush >= brushes.length()) curbrush = brushes.length()-1; - -} - -void nextblendbrush(int *dir) -{ - curbrush += *dir < 0 ? -1 : 1; - if(brushes.empty()) curbrush = -1; - else if(!brushes.inrange(curbrush)) curbrush = *dir < 0 ? brushes.length()-1 : 0; -} - -void setblendbrush(const char *name) -{ - loopv(brushes) if(!strcmp(brushes[i]->name, name)) { curbrush = i; break; } -} - -void getblendbrushname(int *n) -{ - result(brushes.inrange(*n) ? brushes[*n]->name : ""); -} - -void curblendbrush() -{ - intret(curbrush); -} - -COMMAND(clearblendbrushes, ""); -COMMAND(delblendbrush, "s"); -COMMAND(addblendbrush, "ss"); -COMMAND(nextblendbrush, "i"); -COMMAND(setblendbrush, "s"); -COMMAND(getblendbrushname, "i"); -COMMAND(curblendbrush, ""); - -extern int nompedit; - -bool canpaintblendmap(bool brush = true, bool sel = false, bool msg = true) -{ - if(noedit(!sel, msg) || (nompedit && multiplayer())) return false; - if(!blendpaintmode) - { - if(msg) conoutf(CON_ERROR, "operation only allowed in blend paint mode"); - return false; - } - if(brush && !brushes.inrange(curbrush)) - { - if(msg) conoutf(CON_ERROR, "no blend brush selected"); - return false; - } - return true; -} - -void rotateblendbrush(int *val) -{ - if(!canpaintblendmap()) return; - BlendBrush *brush = brushes[curbrush]; - const texrotation &r = texrotations[*val < 0 ? 3 : clamp(*val, 1, 7)]; - brush->reorient(r.flipx, r.flipy, r.swapxy); -} - -COMMAND(rotateblendbrush, "i"); - -void paintblendmap(bool msg) -{ - if(!canpaintblendmap(true, false, msg)) return; - - BlendBrush *brush = brushes[curbrush]; - int x = (int)floor(clamp(worldpos.x, 0.0f, float(worldsize))/(1<w), - y = (int)floor(clamp(worldpos.y, 0.0f, float(worldsize))/(1<h); - blitblendmap(brush->data, x, y, brush->w, brush->h, blendpaintmode); - previewblends(ivec((x-1)<w+1)<h+1)<>BM_SCALE, y1 = sel.o.y>>BM_SCALE, - x2 = (sel.o.x+sel.s.x*sel.grid+(1<>BM_SCALE, - y2 = (sel.o.y+sel.s.y*sel.grid+(1<>BM_SCALE; - fillblendmap(x1, y1, x2-x1, y2-y1, 0xFF); - previewblends(ivec(x1<>BM_SCALE, y1 = sel.o.y>>BM_SCALE, - x2 = (sel.o.x+sel.s.x*sel.grid+(1<>BM_SCALE, - y2 = (sel.o.y+sel.s.y*sel.grid+(1<>BM_SCALE; - invertblendmap(x1, y1, x2-x1, y2-y1); - previewblends(ivec(x1<>BM_SCALE, worldsize>>BM_SCALE); - previewblends(ivec(0, 0, 0), ivec(worldsize, worldsize, worldsize)); -} - -COMMAND(invertblendmap, ""); - -void showblendmap() -{ - if(noedit(true) || (nompedit && multiplayer())) return; - previewblends(ivec(0, 0, 0), ivec(worldsize, worldsize, worldsize)); -} - -COMMAND(showblendmap, ""); -COMMAND(optimizeblendmap, ""); -ICOMMAND(clearblendmap, "", (), -{ - if(noedit(true) || (nompedit && multiplayer())) return; - resetblendmap(); - showblendmap(); -}); - -ICOMMAND(moveblendmap, "ii", (int *dx, int *dy), -{ - if(noedit(true) || (nompedit && multiplayer())) return; - if(*dx%(BM_IMAGE_SIZE<= worldsize || *dy <= -worldsize || *dy >= worldsize) - resetblendmap(); - else - moveblendmap(*dx>>BM_SCALE, *dy>>BM_SCALE); - showblendmap(); -}); - -void renderblendbrush() -{ - if(!blendpaintmode || !brushes.inrange(curbrush)) return; - - BlendBrush *brush = brushes[curbrush]; - int x1 = (int)floor(clamp(worldpos.x, 0.0f, float(worldsize))/(1<w) << BM_SCALE, - y1 = (int)floor(clamp(worldpos.y, 0.0f, float(worldsize))/(1<h) << BM_SCALE, - x2 = x1 + (brush->w << BM_SCALE), - y2 = y1 + (brush->h << BM_SCALE); - - if(max(x1, y1) >= worldsize || min(x2, y2) <= 0 || x1>=x2 || y1>=y2) return; - - if(!brush->tex) brush->gentex(); - renderblendbrush(brush->tex, x1, y1, x2 - x1, y2 - y1); -} - -bool loadblendmap(stream *f, uchar &type, BlendMapNode &node) -{ - type = f->getchar(); - switch(type) - { - case BM_SOLID: - { - int val = f->getchar(); - if(val<0 || val>0xFF) return false; - node.solid = &bmsolids[val]; - break; - } - - case BM_IMAGE: - node.image = new BlendMapImage; - if(f->read(node.image->data, sizeof(node.image->data)) != sizeof(node.image->data)) - return false; - break; - - case BM_BRANCH: - node.branch = new BlendMapBranch; - loopi(4) { node.branch->type[i] = BM_SOLID; node.branch->children[i].solid = &bmsolids[0xFF]; } - loopi(4) if(!loadblendmap(f, node.branch->type[i], node.branch->children[i])) - return false; - break; - - default: - type = BM_SOLID; - node.solid = &bmsolids[0xFF]; - return false; - } - return true; -} - -bool loadblendmap(stream *f, int info) -{ - resetblendmap(); - return loadblendmap(f, blendmap.type, blendmap); -} - -void saveblendmap(stream *f, uchar type, BlendMapNode &node) -{ - f->putchar(type); - switch(type) - { - case BM_SOLID: - f->putchar(node.solid->val); - break; - - case BM_IMAGE: - f->write(node.image->data, sizeof(node.image->data)); - break; - - case BM_BRANCH: - loopi(4) saveblendmap(f, node.branch->type[i], node.branch->children[i]); - break; - } -} - -void saveblendmap(stream *f) -{ - saveblendmap(f, blendmap.type, blendmap); -} - -uchar shouldsaveblendmap() -{ - return blendmap.solid!=&bmsolids[0xFF] ? 1 : 0; -} - diff --git a/src/engine/depthfx.h b/src/engine/depthfx.h deleted file mode 100644 index 89b9adf..0000000 --- a/src/engine/depthfx.h +++ /dev/null @@ -1,172 +0,0 @@ -// eye space depth texture for soft particles, done at low res then blurred to prevent ugly jaggies -VARP(depthfxfpscale, 1, 1<<12, 1<<16); -VARP(depthfxscale, 1, 1<<6, 1<<8); -VARP(depthfxblend, 1, 16, 64); -VARP(depthfxpartblend, 1, 8, 64); -VAR(depthfxmargin, 0, 16, 64); -VAR(depthfxbias, 0, 1, 64); - -extern void cleanupdepthfx(); -VARFP(fpdepthfx, 0, 0, 1, cleanupdepthfx()); -VARP(depthfxemuprecision, 0, 1, 1); -VARFP(depthfxsize, 6, 7, 12, cleanupdepthfx()); -VARP(depthfx, 0, 1, 1); -VARP(depthfxparts, 0, 1, 1); -VARP(blurdepthfx, 0, 1, 7); -VARP(blurdepthfxsigma, 1, 50, 200); -VAR(depthfxscissor, 0, 2, 2); - -#define MAXDFXRANGES 4 - -void *depthfxowners[MAXDFXRANGES]; -float depthfxranges[MAXDFXRANGES]; -int numdepthfxranges = 0; -vec depthfxmin(1e16f, 1e16f, 1e16f), depthfxmax(1e16f, 1e16f, 1e16f); - -static struct depthfxtexture : rendertarget -{ - const GLenum *colorformats() const - { - static const GLenum colorfmts[] = { GL_RG16F, GL_RGB16F, GL_RGBA, GL_RGBA8, GL_RGB, GL_RGB8, GL_FALSE }; - return &colorfmts[fpdepthfx && hasTF ? (hasTRG ? 0 : 1) : 2]; - } - - float eyedepth(const vec &p) const - { - return max(-cammatrix.transform(p).z, 0.0f); - } - - void addscissorvert(const vec &v, float &sx1, float &sy1, float &sx2, float &sy2) - { - vec p = camprojmatrix.perspectivetransform(v); - sx1 = min(sx1, p.x); - sy1 = min(sy1, p.y); - sx2 = max(sx2, p.x); - sy2 = max(sy2, p.y); - } - - bool addscissorbox(const vec ¢er, float size) - { - float sx1, sy1, sx2, sy2; - calcspherescissor(center, size, sx1, sy1, sx2, sy2); - return addblurtiles(sx1, sy1, sx2, sy2); - } - - bool addscissorbox(const vec &bbmin, const vec &bbmax) - { - float sx1 = 1, sy1 = 1, sx2 = -1, sy2 = -1; - loopi(8) - { - vec v(i&1 ? bbmax.x : bbmin.x, i&2 ? bbmax.y : bbmin.y, i&4 ? bbmax.z : bbmin.z); - addscissorvert(v, sx1, sy1, sx2, sy2); - } - return addblurtiles(sx1, sy1, sx2, sy2); - } - - bool screenrect() const { return true; } - bool filter() const { return blurdepthfx!=0; } - bool highprecision() const { return colorfmt==GL_RG16F || colorfmt==GL_RGB16F; } - bool emulatehighprecision() const { return depthfxemuprecision && !blurdepthfx; } - - bool shouldrender() - { - extern void finddepthfxranges(); - finddepthfxranges(); - return (numdepthfxranges && scissorx1 < scissorx2 && scissory1 < scissory2); - } - - bool dorender() - { - glClearColor(1, 1, 1, 1); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - depthfxing = true; - - extern void renderdepthobstacles(const vec &bbmin, const vec &bbmax, float scale, float *ranges, int numranges); - float scale = depthfxscale; - float *ranges = depthfxranges; - int numranges = numdepthfxranges; - if(highprecision()) - { - scale = depthfxfpscale; - ranges = NULL; - numranges = 0; - } - else if(emulatehighprecision()) - { - scale = depthfxfpscale; - ranges = NULL; - numranges = -3; - } - renderdepthobstacles(depthfxmin, depthfxmax, scale, ranges, numranges); - - depthfxing = false; - - return numdepthfxranges > 0; - } -} depthfxtex; - -void cleanupdepthfx() -{ - depthfxtex.cleanup(true); -} - -bool depthfxing = false; - -bool binddepthfxtex() -{ - if(depthfx && depthfxtex.rendertex && numdepthfxranges>0) - { - glActiveTexture_(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, depthfxtex.rendertex); - glActiveTexture_(GL_TEXTURE0); - return true; - } - return false; -} - -void binddepthfxparams(float blend, float minblend = 0, bool allow = true, void *owner = NULL) -{ - if(depthfx && depthfxtex.rendertex && numdepthfxranges>0) - { - float scale = 0, offset = -1, texscale = 0; - if(!depthfxtex.highprecision()) - { - float select[4] = { 0, 0, 0, 0 }; - if(!depthfxtex.emulatehighprecision()) - { - loopi(numdepthfxranges) if(depthfxowners[i]==owner) - { - select[i] = float(depthfxscale)/blend; - scale = 1.0f/blend; - offset = -float(depthfxranges[i] - depthfxbias)/blend; - break; - } - } - else if(allow) - { - select[0] = float(depthfxfpscale)/blend; - select[1] = select[0]/256; - select[2] = select[1]/256; - scale = 1.0f/blend; - offset = 0; - } - LOCALPARAMF(depthfxselect, select[0], select[1], select[2], select[3]); - } - else if(allow) - { - scale = 1.0f/blend; - offset = 0; - texscale = float(depthfxfpscale)/blend; - } - LOCALPARAMF(depthfxparams, scale, offset, texscale, minblend); - } -} - -void drawdepthfxtex() -{ - if(!depthfx) return; - - depthfxtex.render(1< gameargs; @@ -462,27 +456,6 @@ extern void checkmapsounds(); extern void updatesounds(); extern void preloadmapsounds(); -// blendmap -extern int blendpaintmode; - -struct BlendMapCache; -extern BlendMapCache *newblendmapcache(); -extern void freeblendmapcache(BlendMapCache *&cache); -extern bool setblendmaporigin(BlendMapCache *cache, const ivec &o, int size); -extern bool hasblendmap(BlendMapCache *cache); -extern uchar lookupblendmap(BlendMapCache *cache, const vec &pos); -extern void resetblendmap(); -extern void enlargeblendmap(); -extern void shrinkblendmap(int octant); -extern void optimizeblendmap(); -extern void stoppaintblendmap(); -extern void trypaintblendmap(); -extern void renderblendbrush(GLuint tex, float x, float y, float w, float h); -extern void renderblendbrush(); -extern bool loadblendmap(stream *f, int info); -extern void saveblendmap(stream *f); -extern uchar shouldsaveblendmap(); - #endif #endif diff --git a/src/engine/explosion.h b/src/engine/explosion.h index 4880125..819b0a3 100644 --- a/src/engine/explosion.h +++ b/src/engine/explosion.h @@ -1,6 +1,5 @@ namespace sphere { - struct vert { vec pos; @@ -110,13 +109,7 @@ struct fireballrenderer : listrenderer void startrender() { - if(depthfx && depthfxtex.rendertex && numdepthfxranges>0) - { - if(!depthfxtex.highprecision()) SETSHADER(explosionsoft8); - else SETSHADER(explosionsoft); - } - else SETSHADER(explosion); - + SETSHADER(explosion); sphere::enable(); } @@ -130,62 +123,6 @@ struct fireballrenderer : listrenderer sphere::cleanup(); } - int finddepthfxranges(void **owners, float *ranges, int numranges, int maxranges, vec &bbmin, vec &bbmax) - { - static struct fireballent : physent - { - fireballent() - { - type = ENT_CAMERA; - } - } e; - - for(listparticle *p = list; p; p = p->next) - { - int ts = p->fade <= 5 ? 1 : lastmillis-p->millis; - float pmax = p->val, - size = p->fade ? float(ts)/p->fade : 1, - psize = (p->size + pmax * size)*WOBBLE; - if(2*(p->size + pmax)*WOBBLE < depthfxblend || - (!depthfxtex.highprecision() && !depthfxtex.emulatehighprecision() && psize > depthfxscale - depthfxbias) || ) continue; - - e.o = p->o; - e.radius = e.xradius = e.yradius = e.eyeheight = e.aboveeye = psize; - if(!::collide(&e, vec(0, 0, 0), 0, false)) continue; - - if(depthfxscissor==2 && !depthfxtex.addscissorbox(p->o, psize)) continue; - - vec dir = camera1->o; - dir.sub(p->o); - float dist = dir.magnitude(); - dir.mul(psize/dist).add(p->o); - float depth = depthfxtex.eyedepth(dir); - - loopk(3) - { - bbmin[k] = min(bbmin[k], p->o[k] - psize); - bbmax[k] = max(bbmax[k], p->o[k] + psize); - } - - int pos = numranges; - loopi(numranges) if(depth < ranges[i]) { pos = i; break; } - if(pos >= maxranges) continue; - - if(numranges > pos) - { - int moved = min(numranges-pos, maxranges-(pos+1)); - memmove(&ranges[pos+1], &ranges[pos], moved*sizeof(float)); - memmove(&owners[pos+1], &owners[pos], moved*sizeof(void *)); - } - if(numranges < maxranges) numranges++; - - ranges[pos] = depth; - owners[pos] = p; - } - - return numranges; - } - void seedemitter(particleemitter &pe, const vec &o, const vec &d, int fade, float size, int gravity) { pe.maxfade = max(pe.maxfade, fade); @@ -226,7 +163,6 @@ struct fireballrenderer : listrenderer LOCALPARAM(center, o); LOCALPARAMF(millis, lastmillis/1000.0f); LOCALPARAMF(blendparams, inside ? 0.5f : 4, inside ? 0.25f : 0); - binddepthfxparams(depthfxblend, inside ? blend/(2*255.0f) : 0, 2*(p->size + pmax)*WOBBLE >= depthfxblend, p); int passes = inside ? 2 : 1; loopi(passes) @@ -238,5 +174,6 @@ struct fireballrenderer : listrenderer } } }; + static fireballrenderer fireballs("packages/particles/explosion.png"), bluefireballs("packages/particles/plasma.png"); diff --git a/src/engine/lightmap.cpp b/src/engine/lightmap.cpp index da1a5df..e705e4b 100644 --- a/src/engine/lightmap.cpp +++ b/src/engine/lightmap.cpp @@ -22,7 +22,6 @@ struct lightmapworker Slot *slot; vector lights; ShadowRayCache *shadowraycache; - BlendMapCache *blendmapcache; bool needspace, doneworking; SDL_cond *spacecond; SDL_Thread *thread; @@ -424,55 +423,6 @@ static bool packlightmap(lightmapinfo &l, layoutinfo &surface) return true; } -static void updatelightmap(const layoutinfo &surface) -{ - if(max(LM_PACKW, LM_PACKH) > hwtexsize || !lightmaps.inrange(surface.lmid-LMID_RESERVED)) return; - - LightMap &lm = lightmaps[surface.lmid-LMID_RESERVED]; - if(lm.tex < 0) - { - lm.offsetx = lm.offsety = 0; - lm.tex = lightmaptexs.length(); - LightMapTexture &tex = lightmaptexs.add(); - tex.type = lm.type; - tex.w = LM_PACKW; - tex.h = LM_PACKH; - tex.unlitx = lm.unlitx; - tex.unlity = lm.unlity; - glGenTextures(1, &tex.id); - createtexture(tex.id, tex.w, tex.h, NULL, 3, 1, tex.type&LM_ALPHA ? GL_RGBA : GL_RGB); - if((lm.type&LM_TYPE)==LM_BUMPMAP0 && lightmaps.inrange(surface.lmid+1-LMID_RESERVED)) - { - LightMap &lm2 = lightmaps[surface.lmid+1-LMID_RESERVED]; - lm2.offsetx = lm2.offsety = 0; - lm2.tex = lightmaptexs.length(); - LightMapTexture &tex2 = lightmaptexs.add(); - tex2.type = (lm.type&~LM_TYPE) | LM_BUMPMAP0; - tex2.w = LM_PACKW; - tex2.h = LM_PACKH; - tex2.unlitx = lm2.unlitx; - tex2.unlity = lm2.unlity; - glGenTextures(1, &tex2.id); - createtexture(tex2.id, tex2.w, tex2.h, NULL, 3, 1, GL_RGB); - } - } - - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - glPixelStorei(GL_UNPACK_ROW_LENGTH, LM_PACKW); - - glBindTexture(GL_TEXTURE_2D, lightmaptexs[lm.tex].id); - glTexSubImage2D(GL_TEXTURE_2D, 0, lm.offsetx + surface.x, lm.offsety + surface.y, surface.w, surface.h, lm.type&LM_ALPHA ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE, &lm.data[(surface.y*LM_PACKW + surface.x)*lm.bpp]); - if((lm.type&LM_TYPE)==LM_BUMPMAP0 && lightmaps.inrange(surface.lmid+1-LMID_RESERVED)) - { - LightMap &lm2 = lightmaps[surface.lmid+1-LMID_RESERVED]; - glBindTexture(GL_TEXTURE_2D, lightmaptexs[lm2.tex].id); - glTexSubImage2D(GL_TEXTURE_2D, 0, lm2.offsetx + surface.x, lm2.offsety + surface.y, surface.w, surface.h, GL_RGB, GL_UNSIGNED_BYTE, &lm2.data[(surface.y*LM_PACKW + surface.x)*3]); - } - - glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); -} - - static uint generatelumel(lightmapworker *w, const float tolerance, uint lightmask, const vector &lights, const vec &target, const vec &normal, vec &sample, int x, int y) { vec avgray(0, 0, 0); @@ -560,7 +510,7 @@ static bool lumelsample(const vec &sample, int aasample, int stride) static inline void generatealpha(lightmapworker *w, float tolerance, const vec &pos, uchar &alpha) { - alpha = lookupblendmap(w->blendmapcache, pos); + alpha = 0; if(w->slot->layermask) { static const int sdim[] = { 1, 0, 0 }, tdim[] = { 2, 2, 1 }; @@ -628,28 +578,28 @@ static bool generatelightmap(lightmapworker *w, float lpu, const lerpvert *lv, i } if((w->type&LM_TYPE) == LM_BUMPMAP0) memclear(w->raydata, (LM_MAXW + 4)*(LM_MAXH + 4)); - origin1.sub(vec(ystep1).add(xstep1).mul(blurlms)); - origin2.sub(vec(ystep2).add(xstep2).mul(blurlms)); + origin1.sub(vec(ystep1).add(xstep1).mul(0)); + origin2.sub(vec(ystep2).add(xstep2).mul(0)); int aasample = min(1 << lmaa, 4); int stride = aasample*(w->w+1); vec *sample = w->colordata; uchar *amb = w->ambient; lerpbounds start, end; - initlerpbounds(-blurlms, -blurlms, lv, numv, start, end); - float sidex = side0 + blurlms*sidestep; + initlerpbounds(-0, -0, lv, numv, start, end); + float sidex = side0 + 0*sidestep; for(int y = 0; y < w->h; ++y, sidex += sidestep) { vec normal, nstep; - lerpnormal(-blurlms, y - blurlms, lv, numv, start, end, normal, nstep); + lerpnormal(-0, y - 0, lv, numv, start, end, normal, nstep); for(int x = 0; x < w->w; ++x, normal.add(nstep), amb += w->bpp) { #define EDGE_TOLERANCE(x, y) \ - (x < blurlms \ - || x+1 > w->w - blurlms \ - || y < blurlms \ - || y+1 > w->h - blurlms \ + (x < 0 \ + || x+1 > w->w - 0 \ + || y < 0 \ + || y+1 > w->h - 0 \ ? edgetolerance : 1) float t = EDGE_TOLERANCE(x, y) * tolerance; vec u = x < sidex ? vec(xstep1).mul(x).add(vec(ystep1).mul(y)).add(origin1) : vec(xstep2).mul(x).add(vec(ystep2).mul(y)).add(origin2); @@ -660,12 +610,12 @@ static bool generatelightmap(lightmapworker *w, float lpu, const lerpvert *lv, i } if(adaptivesample > 1 && min(w->w, w->h) >= 2) lightmask = ~lightused; sample = w->colordata; - initlerpbounds(-blurlms, -blurlms, lv, numv, start, end); - sidex = side0 + blurlms*sidestep; + initlerpbounds(-0, -0, lv, numv, start, end); + sidex = side0 + 0*sidestep; for(int y = 0; y < w->h; ++y, sidex += sidestep) { vec normal, nstep; - lerpnormal(-blurlms, y - blurlms, lv, numv, start, end, normal, nstep); + lerpnormal(-0, y - 0, lv, numv, start, end, normal, nstep); for(int x = 0; x < w->w; ++x, normal.add(nstep)) { @@ -707,7 +657,7 @@ static bool generatelightmap(lightmapworker *w, float lpu, const lerpvert *lv, i if(aasample > 1) { vec normal, nstep; - lerpnormal(-blurlms, w->h - blurlms, lv, numv, start, end, normal, nstep); + lerpnormal(-0, w->h - 0, lv, numv, start, end, normal, nstep); for(int x = 0; x <= w->w; ++x, normal.add(nstep)) { @@ -730,9 +680,9 @@ static int finishlightmap(lightmapworker *w) float weight = 1.0f / (1.0f + 4.0f*lmaa), cweight = weight * (lmaa == 3 ? 5.0f : 1.0f); vec *ray = w->raydata; - uchar *dstcolor = blurlms && (w->w > 1 || w->h > 1) ? w->blur : w->colorbuf; + uchar *dstcolor = 0 && (w->w > 1 || w->h > 1) ? w->blur : w->colorbuf; uchar mincolor[4] = { 255, 255, 255, 255 }, maxcolor[4] = { 0, 0, 0, 0 }; - bvec *dstray = blurlms && (w->w > 1 || w->h > 1) ? (bvec *)w->raydata : w->raybuf; + bvec *dstray = 0 && (w->w > 1 || w->h > 1) ? (bvec *)w->raydata : w->raybuf; bvec minray(255, 255, 255), maxray(0, 0, 0); loop(y, w->h) { @@ -768,7 +718,7 @@ static int finishlightmap(lightmapworker *w) } if(w->type&LM_ALPHA) { - dstcolor[3] = ambientcolor[3]; + dstcolor[3] = 127;///TODO mincolor[3] = min(mincolor[3], dstcolor[3]); maxcolor[3] = max(maxcolor[3], dstcolor[3]); } @@ -823,13 +773,6 @@ static int finishlightmap(lightmapworker *w) w->lastlightmap->h = w->h = 1; } } - if(blurlms && (w->w>1 || w->h>1)) - { - blurtexture(blurlms, w->bpp, w->w, w->h, w->colorbuf, w->blur, blurlms); - if((w->type&LM_TYPE) == LM_BUMPMAP0) blurnormals(blurlms, w->w, w->h, w->raybuf, (const bvec *)w->raydata, blurlms); - w->lastlightmap->w = (w->w -= 2*blurlms); - w->lastlightmap->h = (w->h -= 2*blurlms); - } if(mincolor[3]==255) return SURFACE_LIGHTMAP_TOP; else if(maxcolor[3]==0) return SURFACE_LIGHTMAP_BOTTOM; else return SURFACE_LIGHTMAP_BLEND; @@ -1019,7 +962,7 @@ static bool findlights(lightmapworker *w, int cx, int cy, int cz, int size, cons case ET_LIGHT: addlight(w, light, cx, cy, cz, size, v, n, numv); break; } } - if(vslot.layer && (setblendmaporigin(w->blendmapcache, ivec(cx, cy, cz), size) || slot.layermask)) return true; + if(vslot.layer) return true; return w->lights.length(); } @@ -1228,11 +1171,6 @@ static int setupsurface(lightmapworker *w, plane planes[2], int numplanes, const int lw = clamp(int(ceil((cmax.x - cmin.x + 1)*lpu)), LM_MINW, LM_MAXW), lh = clamp(int(ceil((cmax.y - cmin.y + 1)*lpu)), LM_MINH, LM_MAXH); w->w = lw; w->h = lh; - if(!preview) - { - w->w += 2*blurlms; - w->h += 2*blurlms; - } if(!alloclightmap(w)) return NO_SURFACE; vec2 cscale = vec2(cmax).sub(cmin).div(vec2(lw-1, lh-1)), @@ -1393,7 +1331,7 @@ static lightmapinfo *setupsurfaces(lightmapworker *w, lightmaptask &task) for(int k = 3; k < numverts; k++) findnormal(pos[k], planes[1], n[k]); } - if(shadertype&(SHADER_NORMALSLMS | SHADER_ENVMAP)) + if(shadertype&SHADER_NORMALSLMS) { loopk(numverts) curlitverts[k].norm = encodenormal(n[k]); if(!(surf.numverts&MAXFACEVERTS)) @@ -1646,189 +1584,6 @@ static void generatelightmaps(cube *c, const ivec &co, int size) } } -static bool previewblends(lightmapworker *w, cube &c, const ivec &co, int size) -{ - if(isempty(c) || c.material&MAT_ALPHA) return false; - - int usefacemask = 0; - loopi(6) if(lookupvslot(c.texture[i], false).layer) - usefacemask |= visibletris(c, i, co, size)<<(4*i); - if(!usefacemask) return false; - - if(!setblendmaporigin(w->blendmapcache, co, size)) - { - if(!c.ext) return false; - bool blends = false; - loopi(6) if(c.ext->surfaces[i].numverts&LAYER_BOTTOM) - { - c.ext->surfaces[i].brighten(); - blends = true; - } - return blends; - } - - w->firstlightmap = w->lastlightmap = w->curlightmaps = NULL; - w->bufstart = w->bufused = 0; - w->c = &c; - - surfaceinfo surfaces[6]; - vertinfo litverts[6*2*MAXFACEVERTS]; - int numlitverts = 0; - memcpy(surfaces, c.ext ? c.ext->surfaces : brightsurfaces, sizeof(surfaces)); - loopi(6) - { - int usefaces = usefacemask&0xF; - usefacemask >>= 4; - if(!usefaces) - { - surfaceinfo &surf = surfaces[i]; - int numverts = surf.totalverts(); - if(numverts) - { - memcpy(&litverts[numlitverts], c.ext->verts() + surf.verts, numverts*sizeof(vertinfo)); - surf.verts = numlitverts; - numlitverts += numverts; - } - continue; - } - - VSlot &vslot = lookupvslot(c.texture[i], false), - &layer = lookupvslot(vslot.layer, false); - Shader *shader = vslot.slot->shader; - int shadertype = shader->type | layer.slot->shader->type; - - vertinfo *curlitverts = &litverts[numlitverts]; - int numverts = 0; - ivec v[4]; - genfaceverts(c, i, v); - int convex = flataxisface(c, i) ? 0 : faceconvexity(v), - order = usefaces&4 || convex < 0 ? 1 : 0; - ivec vo = ivec(co).mask(0xFFF).shl(3); - curlitverts[numverts++].set(v[order].mul(size).add(vo)); - if(usefaces&1) curlitverts[numverts++].set(v[order+1].mul(size).add(vo)); - curlitverts[numverts++].set(v[order+2].mul(size).add(vo)); - if(usefaces&2) curlitverts[numverts++].set(v[(order+3)&3].mul(size).add(vo)); - - vec pos[4], n[4], po(ivec(co).mask(~0xFFF)); - loopj(numverts) pos[j] = vec(curlitverts[j].getxyz()).mul(1.0f/8).add(po); - - plane planes[2]; - int numplanes = 0; - planes[numplanes++].toplane(pos[0], pos[1], pos[2]); - if(numverts < 4 || !convex) loopk(numverts) n[k] = planes[0]; - else - { - planes[numplanes++].toplane(pos[0], pos[2], pos[3]); - vec avg = vec(planes[0]).add(planes[1]).normalize(); - n[0] = avg; - n[1] = planes[0]; - n[2] = avg; - for(int k = 3; k < numverts; k++) n[k] = planes[1]; - } - - surfaceinfo &surf = surfaces[i]; - w->slot = vslot.slot; - w->vslot = &vslot; - w->type = shadertype&SHADER_NORMALSLMS ? LM_BUMPMAP0|LM_ALPHA : LM_DIFFUSE|LM_ALPHA; - w->bpp = 4; - w->orient = i; - w->rotate = vslot.rotation; - int surftype = setupsurface(w, planes, numplanes, pos, n, numverts, curlitverts, true); - switch(surftype) - { - case SURFACE_AMBIENT_TOP: - surf = brightsurface; - continue; - - case SURFACE_AMBIENT_BOTTOM: - surf = brightbottomsurface; - continue; - - case SURFACE_LIGHTMAP_BLEND: - { - if(surf.numverts == (LAYER_BLEND|numverts) && - surf.lmid[0] == surf.lmid[1] && - (surf.numverts&MAXFACEVERTS) == numverts && - !memcmp(curlitverts, c.ext->verts() + surf.verts, numverts*sizeof(vertinfo)) && - lightmaps.inrange(surf.lmid[0]-LMID_RESERVED) && - lightmaps[surf.lmid[0]-LMID_RESERVED].type==w->type) - { - vertinfo *oldverts = c.ext->verts() + surf.verts; - layoutinfo layout; - layout.w = w->w; - layout.h = w->h; - layout.x = (oldverts[0].x - curlitverts[0].x)/((USHRT_MAX+1)/LM_PACKW); - layout.y = (oldverts[0].y - curlitverts[0].y)/((USHRT_MAX+1)/LM_PACKH); - if(LM_PACKW - layout.x >= w->w && LM_PACKH - layout.y >= w->h) - { - layout.lmid = surf.lmid[0]; - copylightmap(*w->lastlightmap, layout); - updatelightmap(layout); - surf.verts = numlitverts; - numlitverts += numverts; - continue; - } - } - - surf.verts = numlitverts; - surf.numverts = LAYER_BLEND|numverts; - numlitverts += numverts; - layoutinfo layout; - if(packlightmap(*w->lastlightmap, layout)) updatelightmap(layout); - surf.lmid[0] = surf.lmid[1] = layout.lmid; - ushort offsetx = layout.x*((USHRT_MAX+1)/LM_PACKW), offsety = layout.y*((USHRT_MAX+1)/LM_PACKH); - loopk(numverts) - { - vertinfo &v = curlitverts[k]; - v.u += offsetx; - v.v += offsety; - } - continue; - } - } - } - - setsurfaces(c, surfaces, litverts, numlitverts); - return true; -} - -static bool previewblends(lightmapworker *w, cube *c, const ivec &co, int size, const ivec &bo, const ivec &bs) -{ - bool changed = false; - loopoctabox(co, size, bo, bs) - { - ivec o(i, co, size); - cubeext *ext = c[i].ext; - if(ext && ext->va && ext->va->hasmerges) - { - changed = true; - destroyva(ext->va); - ext->va = NULL; - invalidatemerges(c[i], co, size, true); - } - if(c[i].children ? previewblends(w, c[i].children, o, size/2, bo, bs) : previewblends(w, c[i], o, size)) - { - changed = true; - ext = c[i].ext; - if(ext && ext->va) - { - destroyva(ext->va); - ext->va = NULL; - } - } - } - return changed; -} - -void previewblends(const ivec &bo, const ivec &bs) -{ - loadlayermasks(); - if(lightmapworkers.empty()) lightmapworkers.add(new lightmapworker); - lightmapworkers[0]->reset(); - if(previewblends(lightmapworkers[0], worldroot, ivec(0, 0, 0), worldsize/2, bo, bs)) - commitchanges(true); -} - void cleanuplightmaps() { loopv(lightmaps) @@ -1860,7 +1615,6 @@ lightmapworker::lightmapworker() colordata = new vec[4*(LM_MAXW+1 + 4)*(LM_MAXH+1 + 4)]; raydata = new vec[(LM_MAXW + 4)*(LM_MAXH + 4)]; shadowraycache = newshadowraycache(); - blendmapcache = newblendmapcache(); needspace = doneworking = false; spacecond = NULL; thread = NULL; @@ -1875,7 +1629,6 @@ lightmapworker::~lightmapworker() delete[] colordata; delete[] raydata; freeshadowraycache(shadowraycache); - freeblendmapcache(blendmapcache); } void lightmapworker::cleanupthread() @@ -1996,7 +1749,6 @@ void calclight(int *quality) } renderbackground("computing lightmaps... (esc to abort)"); mpremip(true); - optimizeblendmap(); loadlayermasks(); int numthreads = lightthreads > 0 ? lightthreads : numcpus; if(numthreads > 1) preloadusedmapmodels(false, true); diff --git a/src/engine/lightmap.h b/src/engine/lightmap.h index 2adf0c5..0f00d61 100644 --- a/src/engine/lightmap.h +++ b/src/engine/lightmap.h @@ -94,7 +94,6 @@ extern void resetlightmaps(bool fullclean = true); extern void brightencube(cube &c); extern void setsurfaces(cube &c, const surfaceinfo *surfs, const vertinfo *verts, int numverts); extern void setsurface(cube &c, int orient, const surfaceinfo &surf, const vertinfo *verts, int numverts); -extern void previewblends(const ivec &bo, const ivec &bs); struct lerpvert { diff --git a/src/engine/main.cpp b/src/engine/main.cpp index 96383c6..d00e0e4 100644 --- a/src/engine/main.cpp +++ b/src/engine/main.cpp @@ -708,9 +708,7 @@ void resetgl() extern void cleanupmodels(); extern void cleanupprefabs(); extern void cleanuplightmaps(); - extern void cleanupblendmap(); extern void cleanshadowmap(); - extern void cleanupdepthfx(); cleanupva(); cleanupparticles(); cleanupdecals(); @@ -718,9 +716,7 @@ void resetgl() cleanupprefabs(); cleanuptextures(); cleanuplightmaps(); - cleanupblendmap(); cleanshadowmap(); - cleanupdepthfx(); cleanupshaders(); cleanupgl(); diff --git a/src/engine/material.cpp b/src/engine/material.cpp index 6fee9d3..b8a3f7f 100644 --- a/src/engine/material.cpp +++ b/src/engine/material.cpp @@ -125,7 +125,7 @@ const char *findmaterialname(int mat) const char *getmaterialdesc(int mat, const char *prefix) { - static const ushort matmasks[] = { MATF_VOLUME|MATF_INDEX, MATF_CLIP, MAT_DEATH, MAT_ALPHA }; + static const ushort matmasks[] = { MATF_INDEX, MATF_CLIP, MAT_DEATH, MAT_ALPHA }; static string desc; desc[0] = '\0'; loopi(sizeof(matmasks)/sizeof(matmasks[0])) if(mat&matmasks[i]) @@ -160,7 +160,7 @@ void genmatsurfs(const cube &c, const ivec &co, int size, vectormatsurfs) { materialsurface &m = va->matbuf[j]; - int matvol = m.material&MATF_VOLUME; + int matvol = 0; if(matvol) hasmat |= 1<material && m.orient == skip->orient && skip->skip < 0xFFFF) @@ -366,10 +366,9 @@ void sortmaterials(vector &vismats) materialsurface &m = va->matbuf[i]; if(!editmode || !showmat || drawtex) { - int matvol = m.material&MATF_VOLUME; + int matvol = 0; if(m.visible == MATSURF_EDIT_ONLY) { i += m.skip; continue; } } - else if(glaring) continue; vismats.add(&m); } } @@ -417,7 +416,6 @@ void rendermaterials() MSlot *mslot = NULL; int lastorient = -1, lastmat = -1; bool depth = true, blended = false; - ushort envmapped = EMID_NONE; GLOBALPARAM(camera, camera1->o); diff --git a/src/engine/model.h b/src/engine/model.h index 4ba41ca..82aea40 100644 --- a/src/engine/model.h +++ b/src/engine/model.h @@ -19,11 +19,9 @@ struct model virtual bool load() = 0; virtual int type() const = 0; virtual BIH *setBIH() { return 0; } - virtual bool envmapped() { return false; } virtual bool skeletal() const { return false; } virtual void setshader(Shader *shader) {} - virtual void setenvmap(float envmapmin, float envmapmax, Texture *envmap) {} virtual void setspec(float spec) {} virtual void setambient(float ambient) {} virtual void setalphatest(float alpha) {} diff --git a/src/engine/octa.h b/src/engine/octa.h index 41e315e..9452ad0 100644 --- a/src/engine/octa.h +++ b/src/engine/octa.h @@ -2,18 +2,11 @@ struct elementset { - ushort texture, lmid, envmap; + ushort texture, lmid; uchar dim, layer; ushort length[2], minvert[2], maxvert[2]; }; -enum -{ - EMID_NONE = 0, - EMID_CUSTOM, - EMID_RESERVED -}; - struct materialsurface { ivec o; @@ -28,7 +21,6 @@ struct materialsurface union { entity *light; - ushort envmap; uchar ends; }; }; @@ -229,7 +221,7 @@ struct undoblock // undo header, all data sits in payload }; extern cube *worldroot; // the world data. only a ptr to 8 cubes (ie: like cube.children above) -extern int wtris, wverts, vtris, vverts, glde, gbatches, rplanes; +extern int wtris, wverts, vtris, vverts, glde, gbatches; extern int allocnodes, allocva, selchildcount, selchildmat; const uint F_EMPTY = 0; // all edges in the range (0,0) diff --git a/src/engine/octaedit.cpp b/src/engine/octaedit.cpp index 239c6a4..af8e9ec 100644 --- a/src/engine/octaedit.cpp +++ b/src/engine/octaedit.cpp @@ -170,7 +170,6 @@ void toggleedit(bool force) player->state = CS_EDITING; } cancelsel(); - stoppaintblendmap(); keyrepeat(editmode); editing = entediting = editmode; extern int fullbright; @@ -353,7 +352,7 @@ void rendereditcursor() od = dimension(orient), odc = dimcoord(orient); - bool hidecursor = g3d_windowhit(true, false) || blendpaintmode, hovering = false; + bool hidecursor = g3d_windowhit(true, false), hovering = false; if(moving) { @@ -531,7 +530,6 @@ void tryedit() { extern int hidehud; if(!editmode || hidehud || mainmenu) return; - if(blendpaintmode) trypaintblendmap(); } //////////// ready changes to vertex arrays //////////// @@ -2333,7 +2331,7 @@ void mpeditmat(int matid, int filter, selinfo &sel, bool local) if(filter >= 0) { filtermat = filter&0xFFFF; - filtermask = filtermat&(MATF_VOLUME|MATF_INDEX) ? (int) MATF_VOLUME|MATF_INDEX : (filtermat&MATF_CLIP ? (int) MATF_CLIP : (int) filtermat); + filtermask = filtermat&(MATF_INDEX) ? (int) MATF_INDEX : (filtermat&MATF_CLIP ? (int) MATF_CLIP : (int) filtermat); filtergeom = filter&~0xFFFF; } if(matid < 0) @@ -2343,7 +2341,7 @@ void mpeditmat(int matid, int filter, selinfo &sel, bool local) } else { - matmask = matid&(MATF_VOLUME|MATF_INDEX) ? 0 : (matid&MATF_CLIP ? ~MATF_CLIP : ~matid); + matmask = matid&MATF_INDEX ? 0 : (matid&MATF_CLIP ? ~MATF_CLIP : ~matid); } loopselxyz(setmat(c, matid, matmask, filtermat, filtermask, filtergeom)); } @@ -2524,11 +2522,7 @@ void rendertexturepanel(int w, int h) { VSlot &vslot = lookupvslot(texmru[ti]), *layer = NULL; Slot &slot = *vslot.slot; - Texture *tex = slot.sts.empty() ? notexture : slot.sts[0].t, *glowtex = NULL, *layertex = NULL; - if(slot.texmask&(1<xs; tc[k].y = tc[k].y/sy - yoff/tex->ys; } glBindTexture(GL_TEXTURE_2D, tex->id); - loopj(glowtex ? 3 : 2) - { - if(j < 2) gle::color(vec(vslot.colorscale).mul(j), texpaneltimer/1000.0f); - else - { - glBindTexture(GL_TEXTURE_2D, glowtex->id); - glBlendFunc(GL_SRC_ALPHA, GL_ONE); - gle::color(vslot.glowcolor, texpaneltimer/1000.0f); - } - gle::begin(GL_TRIANGLE_STRIP); - gle::attribf(x, y); gle::attrib(tc[0]); - gle::attribf(x+r, y); gle::attrib(tc[1]); - gle::attribf(x, y+r); gle::attrib(tc[3]); - gle::attribf(x+r, y+r); gle::attrib(tc[2]); - xtraverts += gle::end(); - if(j==1 && layertex) - { - gle::color(layer->colorscale, texpaneltimer/1000.0f); - glBindTexture(GL_TEXTURE_2D, layertex->id); - gle::begin(GL_TRIANGLE_STRIP); - gle::attribf(x+r/2, y+r/2); gle::attrib(tc[0]); - gle::attribf(x+r, y+r/2); gle::attrib(tc[1]); - gle::attribf(x+r/2, y+r); gle::attrib(tc[3]); - gle::attribf(x+r, y+r); gle::attrib(tc[2]); - xtraverts += gle::end(); - } - if(!j) - { - r -= 10; - x += 5; - y += 5; - } - else if(j == 2) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } } y += s+gap; } diff --git a/src/engine/octarender.cpp b/src/engine/octarender.cpp index d577193..9253379 100644 --- a/src/engine/octarender.cpp +++ b/src/engine/octarender.cpp @@ -169,15 +169,15 @@ enum struct sortkey { - ushort tex, lmid, envmap; + ushort tex, lmid; uchar dim, layer, alpha; sortkey() {} - sortkey(ushort tex, ushort lmid, uchar dim, uchar layer = LAYER_TOP, ushort envmap = EMID_NONE, uchar alpha = NO_ALPHA) - : tex(tex), lmid(lmid), envmap(envmap), dim(dim), layer(layer), alpha(alpha) + sortkey(ushort tex, ushort lmid, uchar dim, uchar layer = LAYER_TOP, uchar alpha = NO_ALPHA) + : tex(tex), lmid(lmid), dim(dim), layer(layer), alpha(alpha) {} - bool operator==(const sortkey &o) const { return tex==o.tex && lmid==o.lmid && envmap==o.envmap && dim==o.dim && layer==o.layer && alpha==o.alpha; } + bool operator==(const sortkey &o) const { return tex==o.tex && lmid==o.lmid && dim==o.dim && layer==o.layer && alpha==o.alpha; } }; struct sortval @@ -301,7 +301,7 @@ struct vacollect : verthash t.tris[l][j] = addvert(vtx2); } } - sortval *dst = indices.access(sortkey(k.tex, t.unlit, k.dim, k.layer, k.envmap, k.alpha)); + sortval *dst = indices.access(sortkey(k.tex, t.unlit, k.dim, k.layer, k.alpha)); if(dst) loopl(2) loopvj(t.tris[l]) dst->tris[l].add(t.tris[l][j]); } } @@ -314,7 +314,7 @@ struct vacollect : verthash { if(k.lmid>=LMID_RESERVED && lightmaptexs[k.lmid].unlitx>=0) { - sortkey ukey(k.tex, LMID_AMBIENT, k.dim, k.layer, k.envmap, k.alpha); + sortkey ukey(k.tex, LMID_AMBIENT, k.dim, k.layer, k.alpha); sortval *uval = indices.access(ukey); if(uval && uval->unlit<=0) { @@ -349,8 +349,6 @@ struct vacollect : verthash { if(x.lmid < y.lmid) return true; if(x.lmid > y.lmid) return false; - if(x.envmap < y.envmap) return true; - if(x.envmap > y.envmap) return false; if(x.dim < y.dim) return true; if(x.dim > y.dim) return false; return false; @@ -435,7 +433,6 @@ struct vacollect : verthash e.lmid = t.unlit>0 ? t.unlit : k.lmid; e.dim = k.dim; e.layer = k.layer; - e.envmap = k.envmap; ushort *startbuf = curbuf; loopl(2) { @@ -463,7 +460,6 @@ struct vacollect : verthash Slot &slot = *lookupvslot(k.tex, false).slot; loopvj(slot.sts) va->texmask |= 1<type&SHADER_ENVMAP) va->texmask |= 1<= LMID_RESERVED) lmid = lm ? lm->tex : LMID_AMBIENT; - sortkey key(texture, lmid, !vslot.scroll.iszero() ? dim : 3, layer == LAYER_BLEND ? LAYER_BLEND : LAYER_TOP, envmap, alpha ? (vslot.alphaback ? ALPHA_BACK : (vslot.alphafront ? ALPHA_FRONT : NO_ALPHA)) : NO_ALPHA); + sortkey key(texture, lmid, !vslot.scroll.iszero() ? dim : 3, layer == LAYER_BLEND ? LAYER_BLEND : LAYER_TOP, alpha ? (vslot.alphaback ? ALPHA_BACK : (vslot.alphafront ? ALPHA_FRONT : NO_ALPHA)) : NO_ALPHA); addtris(key, orient, verts, index, numverts, convex, shadowmask, tj); } @@ -954,19 +950,17 @@ void gencubeverts(cube &c, const ivec &co, int size, int csi) VSlot &vslot = lookupvslot(c.texture[i], true), *layer = vslot.layer && !(c.material&MAT_ALPHA) ? &lookupvslot(vslot.layer, true) : NULL; - ushort envmap = vslot.slot->shader->type&SHADER_ENVMAP ? (int) (vslot.slot->texmask&(1<slot->shader->type&SHADER_ENVMAP ? (int) (layer->slot->texmask&(1<= 0 && tjoints[tj].edge < i*(MAXFACEVERTS+1)) tj = tjoints[tj].next; int hastj = tj >= 0 && tjoints[tj].edge < (i+1)*(MAXFACEVERTS+1) ? tj : -1; if(!c.ext) - addcubeverts(vslot, i, size, pos, convex, c.texture[i], LMID_AMBIENT, NULL, numverts, hastj, envmap, 0, (c.material&MAT_ALPHA)!=0); + addcubeverts(vslot, i, size, pos, convex, c.texture[i], LMID_AMBIENT, NULL, numverts, hastj, 0, (c.material&MAT_ALPHA)!=0); else { const surfaceinfo &surf = c.ext->surfaces[i]; if(!surf.numverts || surf.numverts&LAYER_TOP) - addcubeverts(vslot, i, size, pos, convex, c.texture[i], surf.lmid[0], verts, numverts, hastj, envmap, 0, (c.material&MAT_ALPHA)!=0, LAYER_TOP|(surf.numverts&LAYER_BLEND)); + addcubeverts(vslot, i, size, pos, convex, c.texture[i], surf.lmid[0], verts, numverts, hastj, 0, (c.material&MAT_ALPHA)!=0, LAYER_TOP|(surf.numverts&LAYER_BLEND)); if(surf.numverts&LAYER_BOTTOM) - addcubeverts(layer ? *layer : vslot, i, size, pos, convex, vslot.layer, surf.lmid[1], surf.numverts&LAYER_DUP ? verts + numverts : verts, numverts, hastj, envmap2); + addcubeverts(layer ? *layer : vslot, i, size, pos, convex, vslot.layer, surf.lmid[1], surf.numverts&LAYER_DUP ? verts + numverts : verts, numverts, hastj); } } } @@ -1074,7 +1068,7 @@ void updatevabbs(bool force) struct mergedface { uchar orient, lmid, numverts; - ushort mat, tex, envmap; + ushort mat, tex; vertinfo *verts; int tjoints; }; @@ -1100,7 +1094,6 @@ int genmergedfaces(cube &c, const ivec &co, int size, int minlevel = -1) mf.orient = i; mf.mat = c.material; mf.tex = c.texture[i]; - mf.envmap = EMID_NONE; mf.lmid = surf.lmid[0]; mf.numverts = surf.numverts; mf.verts = c.ext->verts() + surf.verts; @@ -1115,15 +1108,11 @@ int genmergedfaces(cube &c, const ivec &co, int size, int minlevel = -1) VSlot &vslot = lookupvslot(mf.tex, true), *layer = vslot.layer && !(c.material&MAT_ALPHA) ? &lookupvslot(vslot.layer, true) : NULL; - if(vslot.slot->shader->type&SHADER_ENVMAP) - mf.envmap = vslot.slot->texmask&(1<slot->shader->type&SHADER_ENVMAP ? (int) (layer->slot->texmask&(1<= 300 || hasext("GL_EXT_gpu_shader4")) { // on DX10 or above class cards (i.e. GF8 or RadeonHD) enable expensive features - extern int maxdynlights, depthfxsize, blurdepthfx, texcompress; + extern int maxdynlights, texcompress; maxdynlights = MAXDYNLIGHTS; - depthfxsize = 10; - blurdepthfx = 0; texcompress = max(texcompress, 1024 + 1); } } @@ -1039,9 +1033,8 @@ static float findsurface(const vec &v, int &abovemat) do { cube &c = lookupcube(o, 0, co, csize); - int mat = c.material&MATF_VOLUME; - abovemat = (int) MAT_AIR; - return o.z; + abovemat = (int) MAT_AIR; + return o.z; o.z = co.z + csize; } while(o.z < worldsize); @@ -1145,7 +1138,6 @@ void drawtextures() { if(minimized) { deferdrawtextures = true; return; } deferdrawtextures = false; - genenvmaps(); } int xtraverts, xtravertsva; @@ -1187,10 +1179,6 @@ void gl_drawframe() rendergame(true); renderavatar(); - if(wireframe && editmode) glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - - drawdepthfxtex(); - if(wireframe && editmode) glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); rendermaterials(); @@ -1388,8 +1376,6 @@ void gl_drawhud() glEnable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); - renderblendbrush(); - rendereditcursor(); glDepthMask(GL_TRUE); @@ -1454,8 +1440,7 @@ void gl_drawhud() xtravertsva/1024, glde, gbatches, - getnumqueries(), - rplanes + getnumqueries() }; loopi(8) if(prevstats[i]==curstats[i]) curstats[i] = nextstats[i]; diff --git a/src/engine/rendermodel.cpp b/src/engine/rendermodel.cpp index 119b644..9f2aba9 100644 --- a/src/engine/rendermodel.cpp +++ b/src/engine/rendermodel.cpp @@ -113,14 +113,6 @@ void mdldepthoffset(int *offset) COMMAND(mdldepthoffset, "i"); -void mdlenvmap(float *envmapmax, float *envmapmin, char *envmap) -{ - checkmdl; - loadingmodel->setenvmap(*envmapmin, *envmapmax, envmap[0] ? cubemapload(envmap) : NULL); -} - -COMMAND(mdlenvmap, "ffs"); - void mdlfullbright(float *fullbright) { checkmdl; @@ -759,7 +751,7 @@ void rendermodel(entitylight *light, const char *mdl, int anim, const vec &o, fl if(!m) return; vec center(0, 0, 0), bbradius(0, 0, 0); float radius = 0; - bool shadow = !shadowmap && !glaring && (flags&(MDL_SHADOW|MDL_DYNSHADOW)); + bool shadow = !shadowmap && (flags&(MDL_SHADOW|MDL_DYNSHADOW)); if(flags&(MDL_CULL_VFC|MDL_CULL_DIST|MDL_CULL_OCCLUDED|MDL_CULL_QUERY|MDL_SHADOW|MDL_DYNSHADOW)) { diff --git a/src/engine/renderparticles.cpp b/src/engine/renderparticles.cpp index 5bb709d..392e943 100644 --- a/src/engine/renderparticles.cpp +++ b/src/engine/renderparticles.cpp @@ -168,7 +168,6 @@ struct partrenderer virtual void reset() = 0; virtual void resettracked(physent *owner) { } virtual particle *addpart(const vec &o, const vec &d, int fade, int color, float size, int gravity = 0) = 0; - virtual int adddepthfx(vec &bbmin, vec &bbmax) { return 0; } virtual void update() { } virtual void render() = 0; virtual bool haswork() = 0; @@ -835,7 +834,6 @@ typedef varenderer quadrenderer; typedef varenderer taperenderer; typedef varenderer trailrenderer; -#include "depthfx.h" #include "explosion.h" #include "lightning.h" @@ -845,30 +843,6 @@ struct softquadrenderer : quadrenderer : quadrenderer(texname, type|PT_SOFT, collide) { } - - int adddepthfx(vec &bbmin, vec &bbmax) - { - if(!depthfxtex.highprecision() && !depthfxtex.emulatehighprecision()) return 0; - int numsoft = 0; - loopi(numparts) - { - particle &p = parts[i]; - float radius = p.size*SQRT2; - vec o, d; - int blend, ts; - calc(&p, blend, ts, o, d, false); - if((depthfxscissor!=2 || depthfxtex.addscissorbox(p.o, radius))) - { - numsoft++; - loopk(3) - { - bbmin[k] = min(bbmin[k], o[k] - radius); - bbmax[k] = max(bbmax[k], o[k] + radius); - } - } - } - return numsoft; - } }; static partrenderer *parts[] = @@ -899,36 +873,6 @@ static partrenderer *parts[] = &metervs, // meter vs. }; -void finddepthfxranges() -{ - depthfxmin = vec(1e16f, 1e16f, 1e16f); - depthfxmax = vec(0, 0, 0); - numdepthfxranges = fireballs.finddepthfxranges(depthfxowners, depthfxranges, 0, MAXDFXRANGES, depthfxmin, depthfxmax); - numdepthfxranges = bluefireballs.finddepthfxranges(depthfxowners, depthfxranges, numdepthfxranges, MAXDFXRANGES, depthfxmin, depthfxmax); - loopk(3) - { - depthfxmin[k] -= depthfxmargin; - depthfxmax[k] += depthfxmargin; - } - if(depthfxparts) - { - loopi(sizeof(parts)/sizeof(parts[0])) - { - partrenderer *p = parts[i]; - if(p->type&PT_SOFT && p->adddepthfx(depthfxmin, depthfxmax)) - { - if(!numdepthfxranges) - { - numdepthfxranges = 1; - depthfxowners[0] = NULL; - depthfxranges[0] = 0; - } - } - } - } - if(depthfxscissor<2 && numdepthfxranges>0) depthfxtex.addscissorbox(depthfxmin, depthfxmax); -} - VARFP(maxparticles, 10, 4000, 40000, initparticles()); VARFP(fewparticles, 10, 100, 40000, initparticles()); @@ -961,7 +905,6 @@ void renderparticles(bool mainpass) loopi(sizeof(parts)/sizeof(parts[0])) { - if(glaring && !(parts[i]->type&PT_GLARE)) continue; parts[i]->update(); } @@ -969,8 +912,6 @@ void renderparticles(bool mainpass) uint lastflags = PT_LERP|PT_SHADER, flagmask = PT_LERP|PT_MOD|PT_SHADER|PT_NOTEX; - if(binddepthfxtex()) flagmask |= PT_SOFT; - loopi(sizeof(parts)/sizeof(parts[0])) { partrenderer *p = parts[i]; @@ -1002,10 +943,7 @@ void renderparticles(bool mainpass) { if(flags&PT_SOFT) { - if(!depthfxtex.highprecision()) SETSHADER(particlesoft8); - else SETSHADER(particlesoft); - - binddepthfxparams(depthfxpartblend); + SETSHADER(particlesoft); } else if(flags&PT_NOTEX) particlenotextureshader->set(); else particleshader->set(); @@ -1332,14 +1270,8 @@ static void makeparticles(entity &e) if(e.attr3 > 0) color = colorfromattr(e.attr3); else { - int mat = MAT_WATER + clamp(-e.attr3, 0, 3); - const bvec &wfcol = { 0 }; - color = (int(wfcol[0])<<16) | (int(wfcol[1])<<8) | int(wfcol[2]); - if(!color) - { - const bvec &wcol = { 0 }; - color = (int(wcol[0])<<16) | (int(wcol[1])<<8) | int(wcol[2]); - } + int mat = clamp(-e.attr3, 0, 3); + color = 0xff7700; } regularsplash(PART_WATER, color, 150, 4, 200, offsetvec(e.o, e.attr2, rnd(10)), 0.6f, 2); break; diff --git a/src/engine/renderva.cpp b/src/engine/renderva.cpp index 4f6e7a5..854f569 100644 --- a/src/engine/renderva.cpp +++ b/src/engine/renderva.cpp @@ -591,54 +591,6 @@ void renderoutline() gle::disablevertex(); } -HVAR(blendbrushcolor, 0, 0x0000C0, 0xFFFFFF); - -void renderblendbrush(GLuint tex, float x, float y, float w, float h) -{ - SETSHADER(blendbrush); - - gle::enablevertex(); - - glDepthFunc(GL_LEQUAL); - - glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); - - glBindTexture(GL_TEXTURE_2D, tex); - gle::color(vec::hexcolor(blendbrushcolor), 0.25f); - - LOCALPARAMF(texgenS, 1.0f/w, 0, 0, -x/w); - LOCALPARAMF(texgenT, 0, 1.0f/h, 0, -y/h); - - vtxarray *prev = NULL; - for(vtxarray *va = visibleva; va; va = va->next) - { - if(!va->texs || va->occluded >= OCCLUDE_GEOM) continue; - if(va->o.x + va->size <= x || va->o.y + va->size <= y || va->o.x >= x + w || va->o.y >= y + h) continue; - - if(!prev || va->vbuf != prev->vbuf) - { - gle::bindvbo(va->vbuf); - gle::bindebo(va->ebuf); - const vertex *ptr = 0; - gle::vertexpointer(sizeof(vertex), ptr->pos.v); - } - - drawvatris(va, 3*va->tris, va->edata); - xtravertsva += va->verts; - - prev = va; - } - - glDisable(GL_BLEND); - - glDepthFunc(GL_LESS); - - gle::clearvbo(); - gle::clearebo(); - gle::disablevertex(); -} - void rendershadowmapreceivers() { SETSHADER(shadowmapreceiver); @@ -689,67 +641,6 @@ void rendershadowmapreceivers() gle::disablevertex(); } -void renderdepthobstacles(const vec &bbmin, const vec &bbmax, float scale, float *ranges, int numranges) -{ - float scales[4] = { 0, 0, 0, 0 }, offsets[4] = { 0, 0, 0, 0 }; - if(numranges < 0) - { - SETSHADER(depthfxsplitworld); - - loopi(-numranges) - { - if(!i) scales[i] = 1.0f/scale; - else scales[i] = scales[i-1]*256; - } - } - else - { - SETSHADER(depthfxworld); - - if(!numranges) loopi(4) scales[i] = 1.0f/scale; - else loopi(numranges) - { - scales[i] = 1.0f/scale; - offsets[i] = -ranges[i]/scale; - } - } - LOCALPARAMF(depthscale, scales[0], scales[1], scales[2], scales[3]); - LOCALPARAMF(depthoffsets, offsets[0], offsets[1], offsets[2], offsets[3]); - - gle::enablevertex(); - - vtxarray *prev = NULL; - for(vtxarray *va = visibleva; va; va = va->next) - { - if(!va->texs || va->occluded >= OCCLUDE_GEOM || - va->o.x > bbmax.x || va->o.y > bbmax.y || va->o.z > bbmax.z || - va->o.x + va->size < bbmin.x || va->o.y + va->size < bbmin.y || va->o.z + va->size < bbmin.z) - continue; - - if(!prev || va->vbuf != prev->vbuf) - { - gle::bindvbo(va->vbuf); - gle::bindebo(va->ebuf); - const vertex *ptr = 0; - gle::vertexpointer(sizeof(vertex), ptr->pos.v); - } - - drawvatris(va, 3*va->tris, va->edata); - xtravertsva += va->verts; - if(va->alphatris > 0) - { - drawvatris(va, 3*va->alphatris, va->edata + 3*(va->tris + va->blendtris)); - xtravertsva += 3*va->alphatris; - } - - prev = va; - } - - gle::clearvbo(); - gle::clearebo(); - gle::disablevertex(); -} - VAR(oqdist, 0, 256, 1024); VAR(zpass, 0, 1, 1); VAR(envpass, 0, 1, 1); @@ -843,8 +734,6 @@ struct geombatch if(es.texture > b.es.texture) return 1; if(es.lmid < b.es.lmid) return -1; if(es.lmid > b.es.lmid) return 1; - if(es.envmap < b.es.envmap) return -1; - if(es.envmap > b.es.envmap) return 1; if(es.dim < b.es.dim) return -1; if(es.dim > b.es.dim) return 1; return 0; @@ -998,16 +887,7 @@ static void changebatchtmus(renderstate &cur, int pass, geombatch &b) } tmu++; } - if(b.vslot.slot->shader->type&SHADER_ENVMAP && b.es.envmap!=EMID_CUSTOM) - { - GLuint emtex = lookupenvmap(b.es.envmap); - if(cur.textures[tmu]!=emtex) - { - glActiveTexture_(GL_TEXTURE0+tmu); - glBindTexture(GL_TEXTURE_CUBE_MAP, cur.textures[tmu] = emtex); - changed = true; - } - } + if(changed) glActiveTexture_(GL_TEXTURE0); if(cur.dynlightmask != b.va->dynlightmask) @@ -1041,30 +921,18 @@ static void changeslottmus(renderstate &cur, int pass, Slot &slot, VSlot &vslot) cur.colorscale = vslot.colorscale; GLOBALPARAMF(colorparams, 2*vslot.colorscale.x, 2*vslot.colorscale.y, 2*vslot.colorscale.z, 1); } - int tmu = 2, envmaptmu = -1; + int tmu = 2; if(slot.shader->type&SHADER_NORMALSLMS) tmu++; - if(slot.shader->type&SHADER_ENVMAP) envmaptmu = tmu++; loopvj(slot.sts) { Slot::Tex &t = slot.sts[j]; if(t.type==TEX_DIFFUSE || t.combined>=0) continue; - if(t.type==TEX_ENVMAP) + if(cur.textures[tmu]!=t.t->id) { - if(envmaptmu>=0 && t.t && cur.textures[envmaptmu]!=t.t->id) - { - glActiveTexture_(GL_TEXTURE0+envmaptmu); - glBindTexture(GL_TEXTURE_CUBE_MAP, cur.textures[envmaptmu] = t.t->id); - } - } - else - { - if(cur.textures[tmu]!=t.t->id) - { - glActiveTexture_(GL_TEXTURE0+tmu); - glBindTexture(GL_TEXTURE_2D, cur.textures[tmu] = t.t->id); - } - if(++tmu >= 8) break; + glActiveTexture_(GL_TEXTURE0+tmu); + glBindTexture(GL_TEXTURE_2D, cur.textures[tmu] = t.t->id); } + if(++tmu >= 8) break; } glActiveTexture_(GL_TEXTURE0); @@ -1074,7 +942,7 @@ static void changeslottmus(renderstate &cur, int pass, Slot &slot, VSlot &vslot) static void changeshader(renderstate &cur, Shader *s, Slot &slot, VSlot &vslot, bool shadowed) { - if(fading && !cur.blending && !cur.alphaing) + if(!cur.blending && !cur.alphaing) { if(shadowed) s->setvariant(cur.visibledynlights, 3, slot, vslot); else s->setvariant(cur.visibledynlights, 2, slot, vslot); @@ -1257,7 +1125,7 @@ void renderva(renderstate &cur, vtxarray *va, int pass = RENDERPASS_LIGHTMAP, bo if(!cur.alphaing) vverts += va->verts; va->shadowed = false; va->dynlightmask = 0; - if(!drawtex && !glaring && !cur.alphaing) + if(!drawtex && !cur.alphaing) { va->shadowed = isshadowmapreceiver(va); calcdynlightmask(va); @@ -1326,10 +1194,10 @@ VAR(oqgeom, 0, 1, 1); void rendergeom(void) { - bool mainpass = !drawtex && !glaring, + bool mainpass = !drawtex, doOQ = oqfrags && oqgeom && mainpass, doZP = doOQ && zpass, - doSM = shadowmap && !drawtex && !glaring; + doSM = shadowmap && !drawtex; renderstate cur; if(mainpass) { @@ -1518,5 +1386,5 @@ void renderalphageom(void) if(!front) glCullFace(GL_BACK); } - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, fading ? GL_FALSE : GL_TRUE); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); } diff --git a/src/engine/shader.cpp b/src/engine/shader.cpp index 6134275..5e56e81 100644 --- a/src/engine/shader.cpp +++ b/src/engine/shader.cpp @@ -359,7 +359,6 @@ void Shader::allocparams(Slot *slot) { case TEX_DIFFUSE: UNIFORMTEX("diffusemap", 0); break; case TEX_NORMAL: UNIFORMTEX("normalmap", tmu++); break; - case TEX_GLOW: UNIFORMTEX("glowmap", tmu++); break; case TEX_DECAL: UNIFORMTEX("decal", tmu++); break; case TEX_SPEC: if(t.combined<0) UNIFORMTEX("specmap", tmu++); break; case TEX_DEPTH: if(t.combined<0) UNIFORMTEX("depthmap", tmu++); break; @@ -1102,13 +1101,6 @@ void linkvslotshader(VSlot &s, bool load) linkslotshaderparams(s.params, sh, load); if(!sh) return; - - if(s.slot->texmask&(1<skel->usegpuskel) s->setvariant(0, 1); - else s->setvariant(min(maxweights, g->vweights), 1); - } - else if(!g->skel->usegpuskel) s->set(); + if(!g->skel->usegpuskel) s->set(); else s->setvariant(min(maxweights, g->vweights)-1, 0); } diff --git a/src/engine/texture.cpp b/src/engine/texture.cpp index e10dae7..77eac65 100644 --- a/src/engine/texture.cpp +++ b/src/engine/texture.cpp @@ -1529,7 +1529,6 @@ bool settexture(const char *name, int clamp) vector vslots; vector slots; -MSlot materialslots[(MATF_VOLUME|MATF_INDEX)+1]; Slot dummyslot; VSlot dummyvslot(&dummyslot); @@ -1555,14 +1554,6 @@ void texturereset(int *n) COMMAND(texturereset, "i"); -void materialreset() -{ - if(!(identflags&IDF_OVERRIDDEN) && !game::allowedittoggle()) return; - loopi((MATF_VOLUME|MATF_INDEX)+1) materialslots[i].reset(); -} - -COMMAND(materialreset, ""); - static int compactedvslots = 0, compactvslotsprogress = 0, clonedvslots = 0; static bool markingvslots = false; @@ -1571,7 +1562,6 @@ void clearslots() resetslotshader(); slots.deletecontents(); vslots.deletecontents(); - loopi((MATF_VOLUME|MATF_INDEX)+1) materialslots[i].reset(); clonedvslots = 0; } @@ -2033,11 +2023,9 @@ const struct slottex {"u", TEX_UNKNOWN}, {"d", TEX_DECAL}, {"n", TEX_NORMAL}, - {"g", TEX_GLOW}, {"s", TEX_SPEC}, {"z", TEX_DEPTH}, - {"a", TEX_ALPHA}, - {"e", TEX_ENVMAP} + {"a", TEX_ALPHA} }; int findslottex(const char *name) @@ -2053,12 +2041,9 @@ void texture(char *type, char *name, int *rot, int *xoffset, int *yoffset, float { if(slots.length()>=0x10000) return; static int lastmatslot = -1; - int tnum = findslottex(type), matslot = findmaterial(type); + int tnum = findslottex(type); if(tnum<0) tnum = atoi(type); - if(tnum==TEX_DIFFUSE) lastmatslot = matslot; - else if(lastmatslot>=0) matslot = lastmatslot; - else if(slots.empty()) return; - Slot &s = matslot>=0 ? materialslots[matslot] : *(tnum!=TEX_DIFFUSE ? slots.last() : slots.add(new Slot(slots.length()))); + Slot &s = *(tnum!=TEX_DIFFUSE ? slots.last() : slots.add(new Slot(slots.length()))); s.loaded = false; s.texmask |= 1<=8) conoutf(CON_WARN, "warning: too many textures in slot %d", slots.length()-1); @@ -2071,7 +2056,7 @@ void texture(char *type, char *name, int *rot, int *xoffset, int *yoffset, float if(tnum==TEX_DIFFUSE) { setslotshader(s); - VSlot &vs = matslot >= 0 ? materialslots[matslot] : *emptyvslot(s); + VSlot &vs = *emptyvslot(s); vs.reset(); vs.rotation = clamp(*rot, 0, 7); vs.offset = ivec2(*xoffset, *yoffset).max(0); @@ -2155,12 +2140,6 @@ static int findtextype(Slot &s, int type, int last = -1) return -1; } -static void addglow(ImageData &c, ImageData &g, const vec &glowcolor) -{ - if(g.bpp < 3) { readwritergbtex(c, g, loopk(3) dst[k] = clamp(int(dst[k]) + int(src[0]*glowcolor[k]), 0, 255); ); } - else { readwritergbtex(c, g, loopk(3) dst[k] = clamp(int(dst[k]) + int(src[k]*glowcolor[k]), 0, 255); ); } -} - static void mergespec(ImageData &c, ImageData &s) { if(s.bpp < 3) { readwritergbatex(c, s, dst[3] = src[0]; ); } @@ -2245,10 +2224,6 @@ static Slot &loadslot(Slot &s, bool forceload) if(t.combined >= 0) continue; switch(t.type) { - case TEX_ENVMAP: - t.t = cubemapload(t.name); - break; - default: texcombine(s, i, t, forceload); break; @@ -2258,19 +2233,6 @@ static Slot &loadslot(Slot &s, bool forceload) return s; } -MSlot &lookupmaterialslot(int index, bool load) -{ - if(materialslots[index].sts.empty() && index&MATF_INDEX) index &= ~MATF_INDEX; - MSlot &s = materialslots[index]; - if(load && !s.linked) - { - if(!s.loaded) loadslot(s, true); - linkvslotshader(s); - s.linked = true; - } - return s; -} - Slot &lookupslot(int index, bool load) { Slot &s = slots.inrange(index) ? *slots[index] : (slots.inrange(DEFAULT_GEOM) ? *slots[DEFAULT_GEOM] : dummyslot); @@ -2293,11 +2255,6 @@ void linkslotshaders() { loopv(slots) if(slots[i]->loaded) linkslotshader(*slots[i]); loopv(vslots) if(vslots[i]->linked) linkvslotshader(*vslots[i]); - loopi((MATF_VOLUME|MATF_INDEX)+1) if(materialslots[i].loaded) - { - linkslotshader(materialslots[i]); - linkvslotshader(materialslots[i]); - } } Texture *loadthumbnail(Slot &slot) @@ -2318,16 +2275,6 @@ Texture *loadthumbnail(Slot &slot) defformatstring(prefix, "", vslot.colorscale.x, vslot.colorscale.y, vslot.colorscale.z); addname(name, slot, slot.sts[0], false, prefix); } - int glow = -1; - if(slot.texmask&(1<= 0) - { - defformatstring(prefix, "", vslot.glowcolor.x, vslot.glowcolor.y, vslot.glowcolor.z); - addname(name, slot, slot.sts[glow], true, prefix); - } - } VSlot *layer = vslot.layer ? &lookupvslot(vslot.layer, false) : NULL; if(layer) { @@ -2345,7 +2292,6 @@ Texture *loadthumbnail(Slot &slot) { ImageData s, g, l; texturedata(s, NULL, &slot.sts[0], false); - if(glow >= 0) texturedata(g, NULL, &slot.sts[glow], false); if(layer) texturedata(l, NULL, &layer->slot->sts[0], false); if(!s.data) t = slot.thumbnail = notexture; else @@ -2356,7 +2302,6 @@ Texture *loadthumbnail(Slot &slot) if(g.data) { if(g.w != s.w || g.h != s.h) scaleimage(g, s.w, s.h); - addglow(s, g, vslot.glowcolor); } if(l.data) { @@ -2408,7 +2353,6 @@ void cleanuptextures() { loopv(slots) slots[i]->cleanup(); loopv(vslots) vslots[i]->cleanup(); - loopi((MATF_VOLUME|MATF_INDEX)+1) materialslots[i].cleanup(); enumerate(textures, Texture, tex, cleanuptexture(&tex)); } @@ -2431,10 +2375,6 @@ bool reloadtexture(Texture &tex) if(!texturedata(s, tex.name, NULL, true, &compress) || !newtexture(&tex, NULL, s, tex.clamp, tex.mipmap, false, false, compress)) return false; break; } - - case Texture::CUBEMAP: - if(!cubemaploadwildcard(&tex, NULL, tex.mipmap, true)) return false; - break; } return true; } diff --git a/src/engine/texture.h b/src/engine/texture.h index c878788..3679931 100644 --- a/src/engine/texture.h +++ b/src/engine/texture.h @@ -89,7 +89,6 @@ enum { SHADER_DEFAULT = 0, SHADER_NORMALSLMS = 1<<0, - SHADER_ENVMAP = 1<<1, SHADER_OPTION = 1<<3, SHADER_INVALID = 1<<8, @@ -568,11 +567,9 @@ enum TEX_UNKNOWN, TEX_DECAL, TEX_NORMAL, - TEX_GLOW, TEX_SPEC, TEX_DEPTH, - TEX_ALPHA, - TEX_ENVMAP + TEX_ALPHA }; enum @@ -602,7 +599,6 @@ struct VSlot int layer; float alphafront, alphaback; vec colorscale; - vec glowcolor; VSlot(Slot *slot = NULL, int index = -1) : slot(slot), next(NULL), index(index), changed(0) { @@ -624,7 +620,6 @@ struct VSlot alphafront = 0.5f; alphaback = 0; colorscale = vec(1, 1, 1); - glowcolor = vec(1, 1, 1); } void cleanup() diff --git a/src/engine/world.cpp b/src/engine/world.cpp index 322b130..46aaa0f 100644 --- a/src/engine/world.cpp +++ b/src/engine/world.cpp @@ -653,9 +653,6 @@ void renderentradius(extentity &e, bool color) renderentsphere(e, e.attr2); break; - case ET_NOENVMAP: - break; - case ET_MAPMODEL: case ET_PLAYERSTART: { @@ -1217,7 +1214,6 @@ void resetmap() { clearoverrides(); clearmapsounds(); - resetblendmap(); resetlightmaps(); clearslots(); clearparticles(); @@ -1293,8 +1289,6 @@ bool enlargemap(bool force) if(worldsize > 0x1000) splitocta(worldroot, worldsize>>1); - enlargeblendmap(); - allchanged(); return true; @@ -1335,8 +1329,6 @@ void shrinkmap() vector &ents = entities::getents(); loopv(ents) ents[i]->o.sub(vec(offset)); - shrinkblendmap(octant); - allchanged(); conoutf("shrunk map to size %d", worldscale); diff --git a/src/engine/world.h b/src/engine/world.h index 6cf24bc..43ec470 100644 --- a/src/engine/world.h +++ b/src/engine/world.h @@ -14,29 +14,10 @@ struct octaheader int numents; int numpvs; int lightmaps; - int blendmap; int numvars; int numvslots; }; -struct compatheader // map file format header -{ - char magic[4]; // "OCTA" - int version; // any >8bit quantity is little endian - int headersize; // sizeof(header) - int worldsize; - int numents; - int numpvs; - int lightmaps; - int lightprecision, lighterror, lightlod; - uchar ambient; - uchar blendmap; - uchar lerpangle, lerpsubdiv, lerpsubdivsize; - uchar bumperror; - uchar reserved[10]; - char maptitle[128]; -}; - enum { MATSURF_NOT_VISIBLE = 0, diff --git a/src/engine/worldio.cpp b/src/engine/worldio.cpp index 61e0e8e..4d5e178 100644 --- a/src/engine/worldio.cpp +++ b/src/engine/worldio.cpp @@ -53,12 +53,7 @@ bool loadents(const char *fname, vector &ents, uint *crc) lilswap(&hdr.version, 6); if(memcmp(hdr.magic, "OCTA", 4) || hdr.worldsize <= 0|| hdr.numents < 0) { conoutf(CON_ERROR, "map %s has malformatted header", ogzname); delete f; return false; } if(hdr.version>MAPVERSION) { conoutf(CON_ERROR, "map %s requires a newer version of Cube 2: Sauerbraten", ogzname); delete f; return false; } - compatheader chdr; - if(f->read(&hdr.blendmap, sizeof(hdr) - 7*sizeof(int)) != sizeof(hdr) - 7*sizeof(int)) { - conoutf(CON_ERROR, "map %s has malformatted header", ogzname); delete f; return false; - } - lilswap(&hdr.blendmap, 2); lilswap(&hdr.numvslots, 1); loopi(hdr.numvars) @@ -645,7 +640,6 @@ bool save_world(const char *mname, bool nolms) loopv(ents) if(ents[i]->type!=ET_EMPTY || nolms) hdr.numents++; hdr.numpvs = 0; hdr.lightmaps = nolms ? 0 : lightmaps.length(); - hdr.blendmap = shouldsaveblendmap(); hdr.numvars = 0; hdr.numvslots = numvslots; enumerate(idents, ident, id, @@ -723,7 +717,6 @@ bool save_world(const char *mname, bool nolms) renderprogress(float(i+1)/lightmaps.length(), "saving lightmaps..."); } } - if(shouldsaveblendmap()) { renderprogress(0, "saving blendmap..."); saveblendmap(f); } delete f; conoutf("wrote map file %s", ogzname); @@ -746,10 +739,6 @@ bool load_world(const char *mname, const char *cname) // still supports all map lilswap(&hdr.version, 6); if(memcmp(hdr.magic, "OCTA", 4) || hdr.worldsize <= 0|| hdr.numents < 0) { conoutf(CON_ERROR, "map %s has malformatted header", ogzname); delete f; return false; } if(hdr.version>MAPVERSION) { conoutf(CON_ERROR, "map %s requires a newer version of Cube 2: Sauerbraten", ogzname); delete f; return false; } - compatheader chdr; - if(f->read(&hdr.blendmap, sizeof(hdr) - 7*sizeof(int)) != sizeof(hdr) - 7*sizeof(int)) { - conoutf(CON_ERROR, "map %s has malformatted header", ogzname); delete f; return false; - } resetmap(); @@ -760,7 +749,6 @@ bool load_world(const char *mname, const char *cname) // still supports all map setvar("mapversion", hdr.version, true, false); - lilswap(&hdr.blendmap, 2); lilswap(&hdr.numvslots, 1); renderprogress(0, "clearing world..."); @@ -910,8 +898,6 @@ bool load_world(const char *mname, const char *cname) // still supports all map f->read(lm.data, lm.bpp * LM_PACKW * LM_PACKH); lm.finalize(); } - - if(hdr.blendmap) loadblendmap(f, hdr.blendmap); } mapcrc = f->getcrc(); diff --git a/src/fpsgame/game.h b/src/fpsgame/game.h index c37f616..3cdbba3 100644 --- a/src/fpsgame/game.h +++ b/src/fpsgame/game.h @@ -26,7 +26,6 @@ enum // static entity types LIGHT = ET_LIGHT, // lightsource, attr1 = radius, attr2 = intensity MAPMODEL = ET_MAPMODEL, // attr1 = angle, attr2 = idx PLAYERSTART, // attr1 = angle, attr2 = team - ENVMAP = ET_NOENVMAP, // attr1 = radius PARTICLES = ET_PARTICLES, MAPSOUND = ET_SOUND, SPOTLIGHT = ET_SPOTLIGHT, diff --git a/src/shared/ents.h b/src/shared/ents.h index 57e23fe..3ceccf4 100644 --- a/src/shared/ents.h +++ b/src/shared/ents.h @@ -3,7 +3,7 @@ // ET_*: the only static entity types dictated by the engine... rest are gamecode dependent -enum { ET_EMPTY=0, ET_LIGHT, ET_MAPMODEL, ET_PLAYERSTART, ET_NOENVMAP, ET_PARTICLES, ET_SOUND, ET_SPOTLIGHT, ET_GAMESPECIFIC }; +enum { ET_EMPTY=0, ET_LIGHT, ET_MAPMODEL, ET_PLAYERSTART, ET_PARTICLES, ET_SOUND, ET_SPOTLIGHT, ET_GAMESPECIFIC }; struct entity // persistent map entity { diff --git a/src/shared/iengine.h b/src/shared/iengine.h index 8bc7521..74a6634 100644 --- a/src/shared/iengine.h +++ b/src/shared/iengine.h @@ -368,7 +368,7 @@ extern void moveplayer(physent *pl, int moveres, bool local); extern bool moveplayer(physent *pl, int moveres, bool local, int curtime); extern bool collide(physent *d, const vec &dir = vec(0, 0, 0), float cutoff = 0.0f, bool playercol = true, bool insideplayercol = false); extern bool bounce(physent *d, float secs, float elasticity, float grav); -extern bool bounce(physent *d, float elasticity, float float grav); +extern bool bounce(physent *d, float elasticity, float grav); extern void avoidcollision(physent *d, const vec &dir, physent *obstacle, float space); extern bool overlapsdynent(const vec &o, float radius); extern bool movecamera(physent *pl, const vec &dir, float dist, float stepdist); diff --git a/temporary/converter.c b/temporary/converter.c new file mode 100644 index 0000000..ce91965 --- /dev/null +++ b/temporary/converter.c @@ -0,0 +1,82 @@ +#include +#include +#include +#include +#include + +void export_as_obj(const struct aiScene* scene, const char* output_filename) { + FILE* file = fopen(output_filename, "w"); + if (!file) { + fprintf(stderr, "Error opening output file: %s\n", output_filename); + return; + } + + fprintf(file, "# OBJ file exported from MD3 using Assimp\n"); + + // Write vertices + for (unsigned int m = 0; m < scene->mNumMeshes; m++) { + const struct aiMesh* mesh = scene->mMeshes[m]; + for (unsigned int v = 0; v < mesh->mNumVertices; v++) { + fprintf(file, "v %f %f %f\n", + mesh->mVertices[v].x, + mesh->mVertices[v].y, + mesh->mVertices[v].z); + } + } + + // Write faces (indices) + unsigned int vertex_offset = 1; // OBJ indices start at 1 + for (unsigned int m = 0; m < scene->mNumMeshes; m++) { + const struct aiMesh* mesh = scene->mMeshes[m]; + fprintf(file, "o Mesh_%d\n", m); + + for (unsigned int f = 0; f < mesh->mNumFaces; f++) { + const struct aiFace face = mesh->mFaces[f]; + fprintf(file, "f"); + + for (unsigned int i = 0; i < face.mNumIndices; i++) { + fprintf(file, " %u", face.mIndices[i] + vertex_offset); + } + + fprintf(file, "\n"); + } + + vertex_offset += mesh->mNumVertices; + } + + fclose(file); + printf("Successfully exported to: %s\n", output_filename); +} + +int main(int argc, char** argv) { + if (argc != 3) { + printf("Usage: %s \n", argv[0]); + return 1; + } + + const char* input_file = argv[1]; + const char* output_file = argv[2]; + + // Import the MD3 file + const struct aiScene* scene = aiImportFile( + input_file, + aiProcess_Triangulate | // Ensure triangles + aiProcess_JoinIdenticalVertices // Combine duplicate vertices + ); + + if (!scene) { + fprintf(stderr, "Error loading MD3 file: %s\n", aiGetErrorString()); + return 1; + } + + printf("Successfully loaded MD3 file: %s\n", input_file); + printf("Meshes: %u\n", scene->mNumMeshes); + + // Export as OBJ + export_as_obj(scene, output_file); + + // Clean up + aiReleaseImport(scene); + + return 0; +} -- 2.39.5