netradiant-custom/tools/quake3/q3map2/q3map2_fsr_newfiles/q3map2_fsr_svn158.patch
divverent c3fb8e6e16 already apply some safe changes:
emitmetastats
_ls


git-svn-id: svn://svn.icculus.org/netradiant/trunk@235 61c419a2-8eb2-4b30-bcec-8cead039b335
2009-03-28 21:48:25 +00:00

3387 lines
110 KiB
Diff

Index: bspfile_abstract.c
===================================================================
--- bspfile_abstract.c (revision 158)
+++ bspfile_abstract.c (working copy)
@@ -683,8 +683,26 @@
ep->value = copystring( value );
}
+/*
+KeyExists()
+returns true if entity has this key
+*/
+qboolean KeyExists( const entity_t *ent, const char *key )
+{
+ epair_t *ep;
+
+ /* walk epair list */
+ for( ep = ent->epairs; ep != NULL; ep = ep->next )
+ {
+ if( !EPAIR_STRCMP( ep->key, key ) )
+ return qtrue;
+ }
+ /* no match */
+ return qfalse;
+}
+
/*
ValueForKey()
gets the value for an entity key
@@ -803,7 +821,6 @@
{
const char *value;
-
/* get cast shadows */
if( castShadows != NULL )
{
@@ -831,5 +848,19 @@
if( value[ 0 ] != '\0' )
*recvShadows = atoi( value );
}
+
+ /* vortex: game-specific default eneity keys */
+ value = ValueForKey( ent, "classname" );
+ if (!Q_stricmp( game->magic, "dq" ) || !Q_stricmp( game->magic, "prophecy" ) )
+ {
+ /* vortex: deluxe quake default shadow flags */
+ if (!Q_stricmp( value, "func_wall" ) )
+ {
+ if( recvShadows != NULL )
+ *recvShadows = 1;
+ if( castShadows != NULL )
+ *castShadows = 1;
+ }
+ }
}
Index: game_ef.h
===================================================================
--- game_ef.h (revision 158)
+++ game_ef.h (working copy)
@@ -113,7 +113,16 @@
qfalse, /* wolf lighting model? */
128, /* lightmap width/height */
1.0f, /* lightmap gamma */
+ 1.0f, /* lightmap exposure */
1.0f, /* lightmap compensate */
+ 1.0f, /* lightgrid scale */
+ 1.0f, /* lightgrid ambient scale */
+ qfalse, /* disable shader lightstyles hack */
+ qfalse, /* keep light entities on bsp */
+ 8, /* default patchMeta subdivisions tolerance */
+ qfalse, /* patch casting enabled */
+ qfalse, /* compile deluxemaps */
+ 0, /* deluxemaps default mode */
"IBSP", /* bsp file prefix */
46, /* bsp file version */
qfalse, /* cod-style lump len/ofs order */
Index: game_etut.h
===================================================================
--- game_etut.h (revision 158)
+++ game_etut.h (working copy)
@@ -148,7 +148,16 @@
qfalse, /* wolf lighting model? */
128, /* lightmap width/height */
2.2f, /* lightmap gamma */
+ 1.0f, /* lightmap exposure */
1.0f, /* lightmap compensate */
+ 1.0f, /* lightgrid scale */
+ 1.0f, /* lightgrid ambient scale */
+ qfalse, /* disable shader lightstyles hack */
+ qfalse, /* keep light entities on bsp */
+ 8, /* default patchMeta subdivisions tolerance */
+ qfalse, /* patch casting enabled */
+ qfalse, /* compile deluxemaps */
+ 0, /* deluxemaps default mode */
"IBSP", /* bsp file prefix */
47, /* bsp file version */
qfalse, /* cod-style lump len/ofs order */
Index: game_ja.h
===================================================================
--- game_ja.h (revision 158)
+++ game_ja.h (working copy)
@@ -67,7 +67,16 @@
qfalse, /* wolf lighting model? */
128, /* lightmap width/height */
1.0f, /* lightmap gamma */
+ 1.0f, /* lightmap exposure */
1.0f, /* lightmap compensate */
+ 1.0f, /* lightgrid scale */
+ 1.0f, /* lightgrid ambient scale */
+ qfalse, /* disable shader lightstyles hack */
+ qfalse, /* keep light entities on bsp */
+ 8, /* default patchMeta subdivisions tolerance */
+ qfalse, /* patch casting enabled */
+ qfalse, /* compile deluxemaps */
+ 0, /* deluxemaps default mode */
"RBSP", /* bsp file prefix */
1, /* bsp file version */
qfalse, /* cod-style lump len/ofs order */
Index: game_jk2.h
===================================================================
--- game_jk2.h (revision 158)
+++ game_jk2.h (working copy)
@@ -64,7 +64,16 @@
qfalse, /* wolf lighting model? */
128, /* lightmap width/height */
1.0f, /* lightmap gamma */
+ 1.0f, /* lightmap exposure */
1.0f, /* lightmap compensate */
+ 1.0f, /* lightgrid scale */
+ 1.0f, /* lightgrid ambient scale */
+ qfalse, /* disable shader lightstyles hack */
+ qfalse, /* keep light entities on bsp */
+ 8, /* default patchMeta subdivisions tolerance */
+ qfalse, /* patch casting enabled */
+ qfalse, /* compile deluxemaps */
+ 0, /* deluxemaps default mode */
"RBSP", /* bsp file prefix */
1, /* bsp file version */
qfalse, /* cod-style lump len/ofs order */
Index: game_qfusion.h
===================================================================
--- game_qfusion.h (revision 158)
+++ game_qfusion.h (working copy)
@@ -1,195 +1,204 @@
-/* -------------------------------------------------------------------------------
-
-This code is based on source provided under the terms of the Id Software
-LIMITED USE SOFTWARE LICENSE AGREEMENT, a copy of which is included with the
-GtkRadiant sources (see LICENSE_ID). If you did not receive a copy of
-LICENSE_ID, please contact Id Software immediately at info@idsoftware.com.
-
-All changes and additions to the original source which have been developed by
-other contributors (see CONTRIBUTORS) are provided under the terms of the
-license the contributors choose (see LICENSE), to the extent permitted by the
-LICENSE_ID. If you did not receive a copy of the contributor license,
-please contact the GtkRadiant maintainers at info@gtkradiant.com immediately.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-----------------------------------------------------------------------------------
-
-This code has been altered significantly from its original form, to support
-several games based on the Quake III Arena engine, in the form of "Q3Map2."
-
-------------------------------------------------------------------------------- */
-
-
-
-/* marker */
-#ifndef GAME_QFUSION_H
-#define GAME_QFUSION_H
-
-
-
-/* -------------------------------------------------------------------------------
-
-content and surface flags
-
-------------------------------------------------------------------------------- */
-
-/* game flags */
-#define F_CONT_SOLID 1 /* an eye is never valid in a solid */
-#define F_CONT_LAVA 8
-#define F_CONT_SLIME 16
-#define F_CONT_WATER 32
-#define F_CONT_FOG 64
-
-#define F_CONT_AREAPORTAL 0x8000
-
-#define F_CONT_PLAYERCLIP 0x10000
-#define F_CONT_MONSTERCLIP 0x20000
-#define F_CONT_TELEPORTER 0x40000
-#define F_CONT_JUMPPAD 0x80000
-#define F_CONT_CLUSTERPORTAL 0x100000
-#define F_CONT_DONOTENTER 0x200000
-#define F_CONT_BOTCLIP 0x400000
-
-#define F_CONT_ORIGIN 0x1000000 /* removed before bsping an entity */
-
-#define F_CONT_BODY 0x2000000 /* should never be on a brush, only in game */
-#define F_CONT_CORPSE 0x4000000
-#define F_CONT_DETAIL 0x8000000 /* brushes not used for the bsp */
-#define F_CONT_STRUCTURAL 0x10000000 /* brushes used for the bsp */
-#define F_CONT_TRANSLUCENT 0x20000000 /* don't consume surface fragments inside */
-#define F_CONT_TRIGGER 0x40000000
-#define F_CONT_NODROP 0x80000000 /* don't leave bodies or items (death fog, lava) */
-
-#define F_SURF_NODAMAGE 0x1 /* never give falling damage */
-#define F_SURF_SLICK 0x2 /* effects game physics */
-#define F_SURF_SKY 0x4 /* lighting from environment map */
-#define F_SURF_LADDER 0x8
-#define F_SURF_NOIMPACT 0x10 /* don't make missile explosions */
-#define F_SURF_NOMARKS 0x20 /* don't leave missile marks */
-#define F_SURF_FLESH 0x40 /* make flesh sounds and effects */
-#define F_SURF_NODRAW 0x80 /* don't generate a drawsurface at all */
-#define F_SURF_HINT 0x100 /* make a primary bsp splitter */
-#define F_SURF_SKIP 0x200 /* completely ignore, allowing non-closed brushes */
-#define F_SURF_NOLIGHTMAP 0x400 /* surface doesn't need a lightmap */
-#define F_SURF_POINTLIGHT 0x800 /* generate lighting info at vertexes */
-#define F_SURF_METALSTEPS 0x1000 /* clanking footsteps */
-#define F_SURF_NOSTEPS 0x2000 /* no footstep sounds */
-#define F_SURF_NONSOLID 0x4000 /* don't collide against curves with this set */
-#define F_SURF_LIGHTFILTER 0x8000 /* act as a light filter during q3map -light */
-#define F_SURF_ALPHASHADOW 0x10000 /* do per-pixel light shadow casting in q3map */
-#define F_SURF_NODLIGHT 0x20000 /* don't dlight even if solid (solid lava, skies) */
-#define F_SURF_DUST 0x40000 /* leave a dust trail when walking on this surface */
-
-/* ydnar flags */
-#define F_SURF_VERTEXLIT (F_SURF_POINTLIGHT | F_SURF_NOLIGHTMAP)
-
-
-
-/* -------------------------------------------------------------------------------
-
-game_t struct
-
-------------------------------------------------------------------------------- */
-
-{
- "qfusion", /* -game x */
- "baseq3", /* default base game data dir */
- ".q3a", /* unix home sub-dir */
- "quake", /* magic path word */
- "scripts", /* shader directory */
- 2048, /* max lightmapped surface verts */
- 2048, /* max surface verts */
- 12288, /* max surface indexes */
- qtrue, /* flares */
- "flareshader", /* default flare shader */
- qfalse, /* wolf lighting model? */
- 512, /* lightmap width/height */
- 1.0f, /* lightmap gamma */
- 1.0f, /* lightmap compensate */
- "FBSP", /* bsp file prefix */
- 1, /* bsp file version */
- qfalse, /* cod-style lump len/ofs order */
- LoadRBSPFile, /* bsp load function */
- WriteRBSPFile, /* bsp write function */
-
- {
- /* name contentFlags contentFlagsClear surfaceFlags surfaceFlagsClear compileFlags compileFlagsClear */
-
- /* default */
- { "default", F_CONT_SOLID, -1, 0, -1, C_SOLID, -1 },
-
-
- /* ydnar */
- { "lightgrid", 0, 0, 0, 0, C_LIGHTGRID, 0 },
- { "antiportal", 0, 0, 0, 0, C_ANTIPORTAL, 0 },
- { "skip", 0, 0, 0, 0, C_SKIP, 0 },
-
-
- /* compiler */
- { "origin", F_CONT_ORIGIN, F_CONT_SOLID, 0, 0, C_ORIGIN | C_TRANSLUCENT, C_SOLID },
- { "areaportal", F_CONT_AREAPORTAL, F_CONT_SOLID, 0, 0, C_AREAPORTAL | C_TRANSLUCENT, C_SOLID },
- { "trans", F_CONT_TRANSLUCENT, 0, 0, 0, C_TRANSLUCENT, 0 },
- { "detail", F_CONT_DETAIL, 0, 0, 0, C_DETAIL, 0 },
- { "structural", F_CONT_STRUCTURAL, 0, 0, 0, C_STRUCTURAL, 0 },
- { "hint", 0, 0, F_SURF_HINT, 0, C_HINT, 0 },
- { "nodraw", 0, 0, F_SURF_NODRAW, 0, C_NODRAW, 0 },
-
- { "alphashadow", 0, 0, F_SURF_ALPHASHADOW, 0, C_ALPHASHADOW | C_TRANSLUCENT, 0 },
- { "lightfilter", 0, 0, F_SURF_LIGHTFILTER, 0, C_LIGHTFILTER | C_TRANSLUCENT, 0 },
- { "nolightmap", 0, 0, F_SURF_VERTEXLIT, 0, C_VERTEXLIT, 0 },
- { "pointlight", 0, 0, F_SURF_VERTEXLIT, 0, C_VERTEXLIT, 0 },
-
-
- /* game */
- { "nonsolid", 0, F_CONT_SOLID, F_SURF_NONSOLID, 0, 0, C_SOLID },
-
- { "trigger", F_CONT_TRIGGER, F_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
-
- { "water", F_CONT_WATER, F_CONT_SOLID, 0, 0, C_LIQUID | C_TRANSLUCENT, C_SOLID },
- { "slime", F_CONT_SLIME, F_CONT_SOLID, 0, 0, C_LIQUID | C_TRANSLUCENT, C_SOLID },
- { "lava", F_CONT_LAVA, F_CONT_SOLID, 0, 0, C_LIQUID | C_TRANSLUCENT, C_SOLID },
-
- { "playerclip", F_CONT_PLAYERCLIP, F_CONT_SOLID, 0, 0, C_DETAIL | C_TRANSLUCENT, C_SOLID },
- { "monsterclip", F_CONT_MONSTERCLIP, F_CONT_SOLID, 0, 0, C_DETAIL | C_TRANSLUCENT, C_SOLID },
- { "nodrop", F_CONT_NODROP, F_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
-
- { "clusterportal", F_CONT_CLUSTERPORTAL, F_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
- { "donotenter", F_CONT_DONOTENTER, F_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
- { "botclip", F_CONT_BOTCLIP, F_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
-
- { "fog", F_CONT_FOG, F_CONT_SOLID, 0, 0, C_FOG, C_SOLID },
- { "sky", 0, 0, F_SURF_SKY, 0, C_SKY, 0 },
-
- { "slick", 0, 0, F_SURF_SLICK, 0, 0, 0 },
-
- { "noimpact", 0, 0, F_SURF_NOIMPACT, 0, 0, 0 },
- { "nomarks", 0, 0, F_SURF_NOMARKS, 0, C_NOMARKS, 0 },
- { "ladder", 0, 0, F_SURF_LADDER, 0, 0, 0 },
- { "nodamage", 0, 0, F_SURF_NODAMAGE, 0, 0, 0 },
- { "metalsteps", 0, 0, F_SURF_METALSTEPS, 0, 0, 0 },
- { "flesh", 0, 0, F_SURF_FLESH, 0, 0, 0 },
- { "nosteps", 0, 0, F_SURF_NOSTEPS, 0, 0, 0 },
- { "nodlight", 0, 0, F_SURF_NODLIGHT, 0, 0, 0 },
- { "dust", 0, 0, F_SURF_DUST, 0, 0, 0 },
-
-
- /* null */
- { NULL, 0, 0, 0, 0, 0, 0 }
- }
-}
-
-
-
-/* end marker */
-#endif
-
+/* -------------------------------------------------------------------------------
+
+This code is based on source provided under the terms of the Id Software
+LIMITED USE SOFTWARE LICENSE AGREEMENT, a copy of which is included with the
+GtkRadiant sources (see LICENSE_ID). If you did not receive a copy of
+LICENSE_ID, please contact Id Software immediately at info@idsoftware.com.
+
+All changes and additions to the original source which have been developed by
+other contributors (see CONTRIBUTORS) are provided under the terms of the
+license the contributors choose (see LICENSE), to the extent permitted by the
+LICENSE_ID. If you did not receive a copy of the contributor license,
+please contact the GtkRadiant maintainers at info@gtkradiant.com immediately.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+----------------------------------------------------------------------------------
+
+This code has been altered significantly from its original form, to support
+several games based on the Quake III Arena engine, in the form of "Q3Map2."
+
+------------------------------------------------------------------------------- */
+
+
+
+/* marker */
+#ifndef GAME_QFUSION_H
+#define GAME_QFUSION_H
+
+
+
+/* -------------------------------------------------------------------------------
+
+content and surface flags
+
+------------------------------------------------------------------------------- */
+
+/* game flags */
+#define F_CONT_SOLID 1 /* an eye is never valid in a solid */
+#define F_CONT_LAVA 8
+#define F_CONT_SLIME 16
+#define F_CONT_WATER 32
+#define F_CONT_FOG 64
+
+#define F_CONT_AREAPORTAL 0x8000
+
+#define F_CONT_PLAYERCLIP 0x10000
+#define F_CONT_MONSTERCLIP 0x20000
+#define F_CONT_TELEPORTER 0x40000
+#define F_CONT_JUMPPAD 0x80000
+#define F_CONT_CLUSTERPORTAL 0x100000
+#define F_CONT_DONOTENTER 0x200000
+#define F_CONT_BOTCLIP 0x400000
+
+#define F_CONT_ORIGIN 0x1000000 /* removed before bsping an entity */
+
+#define F_CONT_BODY 0x2000000 /* should never be on a brush, only in game */
+#define F_CONT_CORPSE 0x4000000
+#define F_CONT_DETAIL 0x8000000 /* brushes not used for the bsp */
+#define F_CONT_STRUCTURAL 0x10000000 /* brushes used for the bsp */
+#define F_CONT_TRANSLUCENT 0x20000000 /* don't consume surface fragments inside */
+#define F_CONT_TRIGGER 0x40000000
+#define F_CONT_NODROP 0x80000000 /* don't leave bodies or items (death fog, lava) */
+
+#define F_SURF_NODAMAGE 0x1 /* never give falling damage */
+#define F_SURF_SLICK 0x2 /* effects game physics */
+#define F_SURF_SKY 0x4 /* lighting from environment map */
+#define F_SURF_LADDER 0x8
+#define F_SURF_NOIMPACT 0x10 /* don't make missile explosions */
+#define F_SURF_NOMARKS 0x20 /* don't leave missile marks */
+#define F_SURF_FLESH 0x40 /* make flesh sounds and effects */
+#define F_SURF_NODRAW 0x80 /* don't generate a drawsurface at all */
+#define F_SURF_HINT 0x100 /* make a primary bsp splitter */
+#define F_SURF_SKIP 0x200 /* completely ignore, allowing non-closed brushes */
+#define F_SURF_NOLIGHTMAP 0x400 /* surface doesn't need a lightmap */
+#define F_SURF_POINTLIGHT 0x800 /* generate lighting info at vertexes */
+#define F_SURF_METALSTEPS 0x1000 /* clanking footsteps */
+#define F_SURF_NOSTEPS 0x2000 /* no footstep sounds */
+#define F_SURF_NONSOLID 0x4000 /* don't collide against curves with this set */
+#define F_SURF_LIGHTFILTER 0x8000 /* act as a light filter during q3map -light */
+#define F_SURF_ALPHASHADOW 0x10000 /* do per-pixel light shadow casting in q3map */
+#define F_SURF_NODLIGHT 0x20000 /* don't dlight even if solid (solid lava, skies) */
+#define F_SURF_DUST 0x40000 /* leave a dust trail when walking on this surface */
+
+/* ydnar flags */
+#define F_SURF_VERTEXLIT (F_SURF_POINTLIGHT | F_SURF_NOLIGHTMAP)
+
+
+
+/* -------------------------------------------------------------------------------
+
+game_t struct
+
+------------------------------------------------------------------------------- */
+
+{
+ "qfusion", /* -game x */
+ "baseq3", /* default base game data dir */
+ ".q3a", /* unix home sub-dir */
+ "quake", /* magic path word */
+ "scripts", /* shader directory */
+ 2048, /* max lightmapped surface verts */
+ 2048, /* max surface verts */
+ 12288, /* max surface indexes */
+ qtrue, /* flares */
+ "flareshader", /* default flare shader */
+ qfalse, /* wolf lighting model? */
+ 512, /* lightmap width/height */
+ 1.0f, /* lightmap gamma */
+ 1.0f, /* lightmap exposure */
+ 1.0f, /* lightmap compensate */
+ 1.0f, /* lightgrid scale */
+ 1.0f, /* lightgrid ambient scale */
+ qfalse, /* disable shader lightstyles hack */
+ qfalse, /* keep light entities on bsp */
+ 8, /* default patchMeta subdivisions tolerance */
+ qfalse, /* patch casting enabled */
+ qfalse, /* compile deluxemaps */
+ 0, /* deluxemaps default mode */
+ "FBSP", /* bsp file prefix */
+ 1, /* bsp file version */
+ qfalse, /* cod-style lump len/ofs order */
+ LoadRBSPFile, /* bsp load function */
+ WriteRBSPFile, /* bsp write function */
+
+ {
+ /* name contentFlags contentFlagsClear surfaceFlags surfaceFlagsClear compileFlags compileFlagsClear */
+
+ /* default */
+ { "default", F_CONT_SOLID, -1, 0, -1, C_SOLID, -1 },
+
+
+ /* ydnar */
+ { "lightgrid", 0, 0, 0, 0, C_LIGHTGRID, 0 },
+ { "antiportal", 0, 0, 0, 0, C_ANTIPORTAL, 0 },
+ { "skip", 0, 0, 0, 0, C_SKIP, 0 },
+
+
+ /* compiler */
+ { "origin", F_CONT_ORIGIN, F_CONT_SOLID, 0, 0, C_ORIGIN | C_TRANSLUCENT, C_SOLID },
+ { "areaportal", F_CONT_AREAPORTAL, F_CONT_SOLID, 0, 0, C_AREAPORTAL | C_TRANSLUCENT, C_SOLID },
+ { "trans", F_CONT_TRANSLUCENT, 0, 0, 0, C_TRANSLUCENT, 0 },
+ { "detail", F_CONT_DETAIL, 0, 0, 0, C_DETAIL, 0 },
+ { "structural", F_CONT_STRUCTURAL, 0, 0, 0, C_STRUCTURAL, 0 },
+ { "hint", 0, 0, F_SURF_HINT, 0, C_HINT, 0 },
+ { "nodraw", 0, 0, F_SURF_NODRAW, 0, C_NODRAW, 0 },
+
+ { "alphashadow", 0, 0, F_SURF_ALPHASHADOW, 0, C_ALPHASHADOW | C_TRANSLUCENT, 0 },
+ { "lightfilter", 0, 0, F_SURF_LIGHTFILTER, 0, C_LIGHTFILTER | C_TRANSLUCENT, 0 },
+ { "nolightmap", 0, 0, F_SURF_VERTEXLIT, 0, C_VERTEXLIT, 0 },
+ { "pointlight", 0, 0, F_SURF_VERTEXLIT, 0, C_VERTEXLIT, 0 },
+
+
+ /* game */
+ { "nonsolid", 0, F_CONT_SOLID, F_SURF_NONSOLID, 0, 0, C_SOLID },
+
+ { "trigger", F_CONT_TRIGGER, F_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
+
+ { "water", F_CONT_WATER, F_CONT_SOLID, 0, 0, C_LIQUID | C_TRANSLUCENT, C_SOLID },
+ { "slime", F_CONT_SLIME, F_CONT_SOLID, 0, 0, C_LIQUID | C_TRANSLUCENT, C_SOLID },
+ { "lava", F_CONT_LAVA, F_CONT_SOLID, 0, 0, C_LIQUID | C_TRANSLUCENT, C_SOLID },
+
+ { "playerclip", F_CONT_PLAYERCLIP, F_CONT_SOLID, 0, 0, C_DETAIL | C_TRANSLUCENT, C_SOLID },
+ { "monsterclip", F_CONT_MONSTERCLIP, F_CONT_SOLID, 0, 0, C_DETAIL | C_TRANSLUCENT, C_SOLID },
+ { "nodrop", F_CONT_NODROP, F_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
+
+ { "clusterportal", F_CONT_CLUSTERPORTAL, F_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
+ { "donotenter", F_CONT_DONOTENTER, F_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
+ { "botclip", F_CONT_BOTCLIP, F_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
+
+ { "fog", F_CONT_FOG, F_CONT_SOLID, 0, 0, C_FOG, C_SOLID },
+ { "sky", 0, 0, F_SURF_SKY, 0, C_SKY, 0 },
+
+ { "slick", 0, 0, F_SURF_SLICK, 0, 0, 0 },
+
+ { "noimpact", 0, 0, F_SURF_NOIMPACT, 0, 0, 0 },
+ { "nomarks", 0, 0, F_SURF_NOMARKS, 0, C_NOMARKS, 0 },
+ { "ladder", 0, 0, F_SURF_LADDER, 0, 0, 0 },
+ { "nodamage", 0, 0, F_SURF_NODAMAGE, 0, 0, 0 },
+ { "metalsteps", 0, 0, F_SURF_METALSTEPS, 0, 0, 0 },
+ { "flesh", 0, 0, F_SURF_FLESH, 0, 0, 0 },
+ { "nosteps", 0, 0, F_SURF_NOSTEPS, 0, 0, 0 },
+ { "nodlight", 0, 0, F_SURF_NODLIGHT, 0, 0, 0 },
+ { "dust", 0, 0, F_SURF_DUST, 0, 0, 0 },
+
+
+ /* null */
+ { NULL, 0, 0, 0, 0, 0, 0 }
+ }
+}
+
+
+
+/* end marker */
+#endif
+
Index: game_quake3.h
===================================================================
--- game_quake3.h (revision 158)
+++ game_quake3.h (working copy)
@@ -112,7 +112,16 @@
qfalse, /* wolf lighting model? */
128, /* lightmap width/height */
1.0f, /* lightmap gamma */
+ 1.0f, /* lightmap exposure */
1.0f, /* lightmap compensate */
+ 1.0f, /* lightgrid scale */
+ 1.0f, /* lightgrid ambient scale */
+ qfalse, /* disable shader lightstyles hack */
+ qfalse, /* keep light entities on bsp */
+ 8, /* default patchMeta subdivisions tolerance */
+ qfalse, /* patch casting enabled */
+ qfalse, /* compile deluxemaps */
+ 0, /* deluxemaps default mode */
"IBSP", /* bsp file prefix */
46, /* bsp file version */
qfalse, /* cod-style lump len/ofs order */
Index: game_sof2.h
===================================================================
--- game_sof2.h (revision 158)
+++ game_sof2.h (working copy)
@@ -139,7 +139,16 @@
qfalse, /* wolf lighting model? */
128, /* lightmap width/height */
1.0f, /* lightmap gamma */
+ 1.0f, /* lightmap exposure */
1.0f, /* lightmap compensate */
+ 1.0f, /* lightgrid scale */
+ 1.0f, /* lightgrid ambient scale */
+ qfalse, /* disable shader lightstyles hack */
+ qfalse, /* keep light entities on bsp */
+ 8, /* default patchMeta subdivisions tolerance */
+ qfalse, /* patch casting enabled */
+ qfalse, /* compile deluxemaps */
+ 0, /* deluxemaps default mode */
"RBSP", /* bsp file prefix */
1, /* bsp file version */
qfalse, /* cod-style lump len/ofs order */
Index: game_tenebrae.h
===================================================================
--- game_tenebrae.h (revision 158)
+++ game_tenebrae.h (working copy)
@@ -112,7 +112,16 @@
qfalse, /* wolf lighting model? */
512, /* lightmap width/height */
2.0f, /* lightmap gamma */
+ 1.0f, /* lightmap exposure */
1.0f, /* lightmap compensate */
+ 1.0f, /* lightgrid scale */
+ 1.0f, /* lightgrid ambient scale */
+ qtrue, /* disable shader lightstyles hack */
+ qfalse, /* keep light entities on bsp */
+ 8, /* default patchMeta subdivisions tolerance */
+ qfalse, /* patch casting enabled */
+ qtrue, /* compile deluxemaps */
+ 0, /* deluxemaps default mode */
"IBSP", /* bsp file prefix */
46, /* bsp file version */
qfalse, /* cod-style lump len/ofs order */
Index: game_tremulous.h
===================================================================
--- game_tremulous.h (revision 158)
+++ game_tremulous.h (working copy)
@@ -1,160 +1,169 @@
-/* -------------------------------------------------------------------------------
-
-Copyright (C) 1999-2006 Id Software, Inc. and contributors.
-For a list of contributors, see the accompanying CONTRIBUTORS file.
-
-This file is part of GtkRadiant.
-
-GtkRadiant is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-GtkRadiant is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GtkRadiant; if not, write to the Free Software
-Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-----------------------------------------------------------------------------------
-
-This code has been altered significantly from its original form, to support
-several games based on the Quake III Arena engine, in the form of "Q3Map2."
-
-------------------------------------------------------------------------------- */
-
-/* Tremulous support, by LinuxManMikeC */
-
-
-/* marker */
-#ifndef GAME_TREMULOUS_H
-#define GAME_TREMULOUS_H
-
-
-
-/* -------------------------------------------------------------------------------
-
-content and surface flags - also uses defines from game_quake3.h
-
-------------------------------------------------------------------------------- */
-#define TREM_CONT_NOALIENBUILD 0x1000
-#define TREM_CONT_NOHUMANBUILD 0x2000
-#define TREM_CONT_NOBUILD 0x4000
-
-#define TREM_SURF_NOALIENBUILDSURFACE 0x80000
-#define TREM_SURF_NOHUMANBUILDSURFACE 0x100000
-#define TREM_SURF_NOBUILDSURFACE 0x200000
-
-
-
-/* -------------------------------------------------------------------------------
-
-game_t struct
-
-------------------------------------------------------------------------------- */
-
-{
- "tremulous", /* -game x */
- "base", /* default base game data dir */
- ".tremulous", /* unix home sub-dir */
- "tremulous", /* magic path word - think this is right for trem*/
- "scripts", /* shader directory */
- 64, /* max lightmapped surface verts */
- 999, /* max surface verts */
- 6000, /* max surface indexes */
- qfalse, /* flares */
- "flareshader", /* default flare shader */
- qfalse, /* wolf lighting model? */
- 128, /* lightmap width/height */
- 1.0f, /* lightmap gamma */
- 1.0f, /* lightmap compensate */
- "IBSP", /* bsp file prefix */
- 46, /* bsp file version */
- qfalse, /* cod-style lump len/ofs order */
- LoadIBSPFile, /* bsp load function */
- WriteIBSPFile, /* bsp write function */
-
- {
- /* name contentFlags contentFlagsClear surfaceFlags surfaceFlagsClear compileFlags compileFlagsClear */
-
- /* default */
- { "default", Q_CONT_SOLID, -1, 0, -1, C_SOLID, -1 },
-
-
- /* ydnar */
- { "lightgrid", 0, 0, 0, 0, C_LIGHTGRID, 0 },
- { "antiportal", 0, 0, 0, 0, C_ANTIPORTAL, 0 },
- { "skip", 0, 0, 0, 0, C_SKIP, 0 },
-
-
- /* compiler */
- { "origin", Q_CONT_ORIGIN, Q_CONT_SOLID, 0, 0, C_ORIGIN | C_TRANSLUCENT, C_SOLID },
- { "areaportal", Q_CONT_AREAPORTAL, Q_CONT_SOLID, 0, 0, C_AREAPORTAL | C_TRANSLUCENT, C_SOLID },
- { "trans", Q_CONT_TRANSLUCENT, 0, 0, 0, C_TRANSLUCENT, 0 },
- { "detail", Q_CONT_DETAIL, 0, 0, 0, C_DETAIL, 0 },
- { "structural", Q_CONT_STRUCTURAL, 0, 0, 0, C_STRUCTURAL, 0 },
- { "hint", 0, 0, Q_SURF_HINT, 0, C_HINT, 0 },
- { "nodraw", 0, 0, Q_SURF_NODRAW, 0, C_NODRAW, 0 },
-
- { "alphashadow", 0, 0, Q_SURF_ALPHASHADOW, 0, C_ALPHASHADOW | C_TRANSLUCENT, 0 },
- { "lightfilter", 0, 0, Q_SURF_LIGHTFILTER, 0, C_LIGHTFILTER | C_TRANSLUCENT, 0 },
- { "nolightmap", 0, 0, Q_SURF_VERTEXLIT, 0, C_VERTEXLIT, 0 },
- { "pointlight", 0, 0, Q_SURF_VERTEXLIT, 0, C_VERTEXLIT, 0 },
-
-
- /* game */
- { "nonsolid", 0, Q_CONT_SOLID, Q_SURF_NONSOLID, 0, 0, C_SOLID },
-
- { "trigger", Q_CONT_TRIGGER, Q_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
-
- { "water", Q_CONT_WATER, Q_CONT_SOLID, 0, 0, C_LIQUID | C_TRANSLUCENT, C_SOLID },
- { "slime", Q_CONT_SLIME, Q_CONT_SOLID, 0, 0, C_LIQUID | C_TRANSLUCENT, C_SOLID },
- { "lava", Q_CONT_LAVA, Q_CONT_SOLID, 0, 0, C_LIQUID | C_TRANSLUCENT, C_SOLID },
-
- { "playerclip", Q_CONT_PLAYERCLIP, Q_CONT_SOLID, 0, 0, C_DETAIL | C_TRANSLUCENT, C_SOLID },
- { "monsterclip", Q_CONT_MONSTERCLIP, Q_CONT_SOLID, 0, 0, C_DETAIL | C_TRANSLUCENT, C_SOLID },
- { "nodrop", Q_CONT_NODROP, Q_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
-
- { "clusterportal", Q_CONT_CLUSTERPORTAL, Q_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
- { "donotenter", Q_CONT_DONOTENTER, Q_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
- { "botclip", Q_CONT_BOTCLIP, Q_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
-
- { "fog", Q_CONT_FOG, Q_CONT_SOLID, 0, 0, C_FOG, C_SOLID },
- { "sky", 0, 0, Q_SURF_SKY, 0, C_SKY, 0 },
-
- { "slick", 0, 0, Q_SURF_SLICK, 0, 0, 0 },
-
- { "noimpact", 0, 0, Q_SURF_NOIMPACT, 0, 0, 0 },
- { "nomarks", 0, 0, Q_SURF_NOMARKS, 0, C_NOMARKS, 0 },
- { "ladder", 0, 0, Q_SURF_LADDER, 0, 0, 0 },
- { "nodamage", 0, 0, Q_SURF_NODAMAGE, 0, 0, 0 },
- { "metalsteps", 0, 0, Q_SURF_METALSTEPS, 0, 0, 0 },
- { "flesh", 0, 0, Q_SURF_FLESH, 0, 0, 0 },
- { "nosteps", 0, 0, Q_SURF_NOSTEPS, 0, 0, 0 },
- { "nodlight", 0, 0, Q_SURF_NODLIGHT, 0, 0, 0 },
- { "dust", 0, 0, Q_SURF_DUST, 0, 0, 0 },
-
-
- /* tremulous */
- {"noalienbuild", TREM_CONT_NOALIENBUILD,0,0,0,0,0},
- {"nohumanbuild", TREM_CONT_NOHUMANBUILD,0,0,0,0,0},
- {"nobuild", TREM_CONT_NOBUILD,0,0,0,0,0},
-
- {"noalienbuildsurface", 0,0,TREM_SURF_NOALIENBUILDSURFACE,0,0,0},
- {"nohumanbuildsurface", 0,0,TREM_SURF_NOHUMANBUILDSURFACE,0,0,0},
- {"nobuildsurface", 0,0,TREM_SURF_NOBUILDSURFACE,0,0,0},
-
-
- /* null */
- { NULL, 0, 0, 0, 0, 0, 0 }
- }
-}
-
-
-
-/* end marker */
-#endif
-
+/* -------------------------------------------------------------------------------
+
+Copyright (C) 1999-2006 Id Software, Inc. and contributors.
+For a list of contributors, see the accompanying CONTRIBUTORS file.
+
+This file is part of GtkRadiant.
+
+GtkRadiant is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+GtkRadiant is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GtkRadiant; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+----------------------------------------------------------------------------------
+
+This code has been altered significantly from its original form, to support
+several games based on the Quake III Arena engine, in the form of "Q3Map2."
+
+------------------------------------------------------------------------------- */
+
+/* Tremulous support, by LinuxManMikeC */
+
+
+/* marker */
+#ifndef GAME_TREMULOUS_H
+#define GAME_TREMULOUS_H
+
+
+
+/* -------------------------------------------------------------------------------
+
+content and surface flags - also uses defines from game_quake3.h
+
+------------------------------------------------------------------------------- */
+#define TREM_CONT_NOALIENBUILD 0x1000
+#define TREM_CONT_NOHUMANBUILD 0x2000
+#define TREM_CONT_NOBUILD 0x4000
+
+#define TREM_SURF_NOALIENBUILDSURFACE 0x80000
+#define TREM_SURF_NOHUMANBUILDSURFACE 0x100000
+#define TREM_SURF_NOBUILDSURFACE 0x200000
+
+
+
+/* -------------------------------------------------------------------------------
+
+game_t struct
+
+------------------------------------------------------------------------------- */
+
+{
+ "tremulous", /* -game x */
+ "base", /* default base game data dir */
+ ".tremulous", /* unix home sub-dir */
+ "tremulous", /* magic path word - think this is right for trem*/
+ "scripts", /* shader directory */
+ 64, /* max lightmapped surface verts */
+ 999, /* max surface verts */
+ 6000, /* max surface indexes */
+ qfalse, /* flares */
+ "flareshader", /* default flare shader */
+ qfalse, /* wolf lighting model? */
+ 128, /* lightmap width/height */
+ 1.0f, /* lightmap gamma */
+ 1.0f, /* lightmap exposure */
+ 1.0f, /* lightmap compensate */
+ 1.0f, /* lightgrid scale */
+ 1.0f, /* lightgrid ambient scale */
+ qfalse, /* disable shader lightstyles hack */
+ qfalse, /* keep light entities on bsp */
+ 8, /* default patchMeta subdivisions tolerance */
+ qfalse, /* patch casting enabled */
+ qfalse, /* compile deluxemaps */
+ 0, /* deluxemaps default mode */
+ "IBSP", /* bsp file prefix */
+ 46, /* bsp file version */
+ qfalse, /* cod-style lump len/ofs order */
+ LoadIBSPFile, /* bsp load function */
+ WriteIBSPFile, /* bsp write function */
+
+ {
+ /* name contentFlags contentFlagsClear surfaceFlags surfaceFlagsClear compileFlags compileFlagsClear */
+
+ /* default */
+ { "default", Q_CONT_SOLID, -1, 0, -1, C_SOLID, -1 },
+
+
+ /* ydnar */
+ { "lightgrid", 0, 0, 0, 0, C_LIGHTGRID, 0 },
+ { "antiportal", 0, 0, 0, 0, C_ANTIPORTAL, 0 },
+ { "skip", 0, 0, 0, 0, C_SKIP, 0 },
+
+
+ /* compiler */
+ { "origin", Q_CONT_ORIGIN, Q_CONT_SOLID, 0, 0, C_ORIGIN | C_TRANSLUCENT, C_SOLID },
+ { "areaportal", Q_CONT_AREAPORTAL, Q_CONT_SOLID, 0, 0, C_AREAPORTAL | C_TRANSLUCENT, C_SOLID },
+ { "trans", Q_CONT_TRANSLUCENT, 0, 0, 0, C_TRANSLUCENT, 0 },
+ { "detail", Q_CONT_DETAIL, 0, 0, 0, C_DETAIL, 0 },
+ { "structural", Q_CONT_STRUCTURAL, 0, 0, 0, C_STRUCTURAL, 0 },
+ { "hint", 0, 0, Q_SURF_HINT, 0, C_HINT, 0 },
+ { "nodraw", 0, 0, Q_SURF_NODRAW, 0, C_NODRAW, 0 },
+
+ { "alphashadow", 0, 0, Q_SURF_ALPHASHADOW, 0, C_ALPHASHADOW | C_TRANSLUCENT, 0 },
+ { "lightfilter", 0, 0, Q_SURF_LIGHTFILTER, 0, C_LIGHTFILTER | C_TRANSLUCENT, 0 },
+ { "nolightmap", 0, 0, Q_SURF_VERTEXLIT, 0, C_VERTEXLIT, 0 },
+ { "pointlight", 0, 0, Q_SURF_VERTEXLIT, 0, C_VERTEXLIT, 0 },
+
+
+ /* game */
+ { "nonsolid", 0, Q_CONT_SOLID, Q_SURF_NONSOLID, 0, 0, C_SOLID },
+
+ { "trigger", Q_CONT_TRIGGER, Q_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
+
+ { "water", Q_CONT_WATER, Q_CONT_SOLID, 0, 0, C_LIQUID | C_TRANSLUCENT, C_SOLID },
+ { "slime", Q_CONT_SLIME, Q_CONT_SOLID, 0, 0, C_LIQUID | C_TRANSLUCENT, C_SOLID },
+ { "lava", Q_CONT_LAVA, Q_CONT_SOLID, 0, 0, C_LIQUID | C_TRANSLUCENT, C_SOLID },
+
+ { "playerclip", Q_CONT_PLAYERCLIP, Q_CONT_SOLID, 0, 0, C_DETAIL | C_TRANSLUCENT, C_SOLID },
+ { "monsterclip", Q_CONT_MONSTERCLIP, Q_CONT_SOLID, 0, 0, C_DETAIL | C_TRANSLUCENT, C_SOLID },
+ { "nodrop", Q_CONT_NODROP, Q_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
+
+ { "clusterportal", Q_CONT_CLUSTERPORTAL, Q_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
+ { "donotenter", Q_CONT_DONOTENTER, Q_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
+ { "botclip", Q_CONT_BOTCLIP, Q_CONT_SOLID, 0, 0, C_TRANSLUCENT, C_SOLID },
+
+ { "fog", Q_CONT_FOG, Q_CONT_SOLID, 0, 0, C_FOG, C_SOLID },
+ { "sky", 0, 0, Q_SURF_SKY, 0, C_SKY, 0 },
+
+ { "slick", 0, 0, Q_SURF_SLICK, 0, 0, 0 },
+
+ { "noimpact", 0, 0, Q_SURF_NOIMPACT, 0, 0, 0 },
+ { "nomarks", 0, 0, Q_SURF_NOMARKS, 0, C_NOMARKS, 0 },
+ { "ladder", 0, 0, Q_SURF_LADDER, 0, 0, 0 },
+ { "nodamage", 0, 0, Q_SURF_NODAMAGE, 0, 0, 0 },
+ { "metalsteps", 0, 0, Q_SURF_METALSTEPS, 0, 0, 0 },
+ { "flesh", 0, 0, Q_SURF_FLESH, 0, 0, 0 },
+ { "nosteps", 0, 0, Q_SURF_NOSTEPS, 0, 0, 0 },
+ { "nodlight", 0, 0, Q_SURF_NODLIGHT, 0, 0, 0 },
+ { "dust", 0, 0, Q_SURF_DUST, 0, 0, 0 },
+
+
+ /* tremulous */
+ {"noalienbuild", TREM_CONT_NOALIENBUILD,0,0,0,0,0},
+ {"nohumanbuild", TREM_CONT_NOHUMANBUILD,0,0,0,0,0},
+ {"nobuild", TREM_CONT_NOBUILD,0,0,0,0,0},
+
+ {"noalienbuildsurface", 0,0,TREM_SURF_NOALIENBUILDSURFACE,0,0,0},
+ {"nohumanbuildsurface", 0,0,TREM_SURF_NOHUMANBUILDSURFACE,0,0,0},
+ {"nobuildsurface", 0,0,TREM_SURF_NOBUILDSURFACE,0,0,0},
+
+
+ /* null */
+ { NULL, 0, 0, 0, 0, 0, 0 }
+ }
+}
+
+
+
+/* end marker */
+#endif
+
Index: game_wolf.h
===================================================================
--- game_wolf.h (revision 158)
+++ game_wolf.h (working copy)
@@ -129,7 +129,16 @@
qtrue, /* wolf lighting model? */
128, /* lightmap width/height */
1.0f, /* lightmap gamma */
+ 1.0f, /* lightmap exposure */
1.0f, /* lightmap compensate */
+ 1.0f, /* lightgrid scale */
+ 1.0f, /* lightgrid ambient scale */
+ qfalse, /* disable shader lightstyles hack */
+ qfalse, /* keep light entities on bsp */
+ 8, /* default patchMeta subdivisions tolerance */
+ qfalse, /* patch casting enabled */
+ qfalse, /* compile deluxemaps */
+ 0, /* deluxemaps default mode */
"IBSP", /* bsp file prefix */
47, /* bsp file version */
qfalse, /* cod-style lump len/ofs order */
Index: game_wolfet.h
===================================================================
--- game_wolfet.h (revision 158)
+++ game_wolfet.h (working copy)
@@ -66,7 +66,16 @@
qtrue, /* wolf lighting model? */
128, /* lightmap width/height */
1.0f, /* lightmap gamma */
+ 1.0f, /* lightmap exposure */
1.0f, /* lightmap compensate */
+ 1.0f, /* lightgrid scale */
+ 1.0f, /* lightgrid ambient scale */
+ qfalse, /* disable shader lightstyles hack */
+ qfalse, /* keep light entities on bsp */
+ 8, /* default patchMeta subdivisions tolerance */
+ qfalse, /* patch casting enabled */
+ qfalse, /* compile deluxemaps */
+ 0, /* deluxemaps default mode */
"IBSP", /* bsp file prefix */
47, /* bsp file version */
qfalse, /* cod-style lump len/ofs order */
Index: light.c
===================================================================
--- light.c (revision 158)
+++ light.c (working copy)
@@ -313,7 +313,15 @@
flags |= LIGHT_GRID;
flags &= ~LIGHT_SURFACES;
}
-
+
+ /* vortex: unnormalized? */
+ if (spawnflags & 32)
+ flags |= LIGHT_UNNORMALIZED;
+
+ /* vortex: distance atten? */
+ if (spawnflags & 64)
+ flags |= LIGHT_ATTEN_DISTANCE;
+
/* store the flags */
light->flags = flags;
@@ -357,12 +365,13 @@
intensity *= scale;
/* ydnar: get deviance and samples */
+ /* VorteX: now set start value for _samples when _deviance is found */
deviance = FloatForKey( e, "_deviance" );
if( deviance == 0.0f )
deviance = FloatForKey( e, "_deviation" );
if( deviance == 0.0f )
deviance = FloatForKey( e, "_jitter" );
- numSamples = IntForKey( e, "_samples" );
+ numSamples = max(IntForKey( e, "_samples" ), deviance);
if( deviance < 0.0f || numSamples < 1 )
{
deviance = 0.0f;
@@ -385,14 +394,16 @@
if( _color && _color[ 0 ] )
{
sscanf( _color, "%f %f %f", &light->color[ 0 ], &light->color[ 1 ], &light->color[ 2 ] );
- ColorNormalize( light->color, light->color );
+ if (!(light->flags & LIGHT_UNNORMALIZED))
+ {
+ ColorNormalize( light->color, light->color );
+ }
}
else
light->color[ 0 ] = light->color[ 1 ] = light->color[ 2 ] = 1.0f;
-
+
intensity = intensity * pointScale;
light->photons = intensity;
-
light->type = EMIT_POINT;
/* set falloff threshold */
@@ -741,6 +752,7 @@
/* clear color */
VectorClear( trace->color );
+ VectorClear( trace->colorNoShadow );
/* ydnar: early out */
if( !(light->flags & LIGHT_SURFACES) || light->envelope <= 0.0f )
@@ -766,7 +778,6 @@
float d;
vec3_t pushedOrigin;
-
/* project sample point into light plane */
d = DotProduct( trace->origin, light->normal ) - light->dist;
if( d < 3.0f )
@@ -881,8 +892,7 @@
{
float distByNormal, radiusAtDist, sampleRadius;
vec3_t pointAtDist, distToSample;
-
-
+
/* do cone calculation */
distByNormal = -DotProduct( trace->displacement, light->normal );
if( distByNormal < 0.0f )
@@ -922,6 +932,9 @@
add = light->photons * angle;
if( add <= 0.0f )
return 0;
+
+ /* VorteX: set noShadow color */
+ VectorScale(light->color, add, trace->colorNoShadow);
/* setup trace */
trace->testAll = qtrue;
@@ -942,6 +955,9 @@
/* return to sender */
return 1;
}
+
+ /* VorteX: set noShadow color */
+ VectorScale(light->color, add, trace->colorNoShadow);
/* ydnar: changed to a variable number */
if( add <= 0.0f || (add <= light->falloffTolerance && (light->flags & LIGHT_FAST_ACTUAL)) )
@@ -1378,6 +1394,56 @@
break;
}
+ /////// Floodlighting for point //////////////////
+ //do our floodlight ambient occlusion loop, and add a single contribution based on the brightest dir
+ if (floodlighty)
+ {
+ int q;
+ float addSize,f;
+ vec3_t col,dir;
+ col[0]=col[1]=col[2]=floodlightIntensity;
+ dir[0]=dir[1]=0;
+ dir[2]=1;
+
+ trace.testOcclusion = qtrue;
+ trace.forceSunlight = qfalse;
+ trace.inhibitRadius = DEFAULT_INHIBIT_RADIUS;
+ trace.testAll = qtrue;
+
+ for (q=0;q<2;q++)
+ {
+ if (q==0) //upper hemisphere
+ {
+ trace.normal[0]=0;
+ trace.normal[1]=0;
+ trace.normal[2]=1;
+ }
+ else //lower hemisphere
+ {
+ trace.normal[0]=0;
+ trace.normal[1]=0;
+ trace.normal[2]=-1;
+ }
+
+ f = FloodLightForSample(&trace, floodlightDistance, floodlight_lowquality);
+
+ contributions[ numCon ].color[0]=col[0]*f;
+ contributions[ numCon ].color[1]=col[1]*f;
+ contributions[ numCon ].color[2]=col[2]*f;
+
+ contributions[ numCon ].dir[0]=dir[0];
+ contributions[ numCon ].dir[1]=dir[1];
+ contributions[ numCon ].dir[2]=dir[2];
+
+ contributions[ numCon ].style = 0;
+ numCon++;
+ /* push average direction around */
+ addSize = VectorLength( col );
+ VectorMA( gp->dir, addSize, dir, gp->dir );
+ }
+ }
+ /////////////////////
+
/* normalize to get primary light direction */
VectorNormalize( gp->dir, gp->dir );
@@ -1420,6 +1486,9 @@
/* ambient light will be at 1/4 the value of directed light */
/* (ydnar: nuke this in favor of more dramatic lighting?) */
+ /* (PM: how about actually making it work? d=1 when it got here for single lights/sun :P */
+// d = 0.25f;
+ /* (Hobbes: always setting it to .25 is hardly any better) */
d = 0.25f * (1.0f - d);
VectorMA( gp->ambient[ j ], d, contributions[ i ].color, gp->ambient[ j ] );
}
@@ -1437,8 +1506,10 @@
for( j = 0; j < 3; j++ )
if( color[ j ] < minGridLight[ j ] )
color[ j ] = minGridLight[ j ];
- ColorToBytes( color, bgp->ambient[ i ], 1.0f );
- ColorToBytes( gp->directed[ i ], bgp->directed[ i ], 1.0f );
+
+ /* vortex: apply gridscale and gridambientscale here */
+ ColorToBytes( color, bgp->ambient[ i ], gridScale*gridAmbientScale );
+ ColorToBytes( gp->directed[ i ], bgp->directed[ i ], gridScale );
}
/* debug code */
@@ -1654,14 +1725,12 @@
if( dirty )
{
Sys_Printf( "--- DirtyRawLightmap ---\n" );
-
-
-
-
RunThreadsOnIndividual( numRawLightmaps, qtrue, DirtyRawLightmap );
}
-
+ /* floodlight pass */
+ FloodlightRawLightmaps();
+
/* ydnar: set up light envelopes */
SetupEnvelopes( qfalse, fast );
@@ -1774,12 +1843,64 @@
/* note it */
Sys_Printf( "--- Light ---\n" );
-
+ Sys_Printf( "--- ProcessGameSpecific ---\n" );
+
/* set standard game flags */
wolfLight = game->wolfLight;
+ if (wolfLight == qtrue)
+ Sys_Printf( " lightning model: wolf\n" );
+ else
+ Sys_Printf( " lightning model: quake3\n" );
+
lmCustomSize = game->lightmapSize;
+ Sys_Printf( " lightmap size: %d x %d pixels\n", lmCustomSize, lmCustomSize );
+
lightmapGamma = game->lightmapGamma;
+ Sys_Printf( " lightning gamma: %f\n", lightmapGamma );
+
lightmapCompensate = game->lightmapCompensate;
+ Sys_Printf( " lightning compensation: %f\n", lightmapCompensate );
+
+ lightmapExposure = game->lightmapExposure;
+ Sys_Printf( " lightning exposure: %f\n", lightmapExposure );
+
+ gridScale = game->gridScale;
+ Sys_Printf( " lightgrid scale: %f\n", gridScale );
+
+ gridAmbientScale = game->gridAmbientScale;
+ Sys_Printf( " lightgrid ambient scale: %f\n", gridAmbientScale );
+
+ noStyles = game->noStyles;
+ if (noStyles == qtrue)
+ Sys_Printf( " shader lightstyles hack: disabled\n" );
+ else
+ Sys_Printf( " shader lightstyles hack: enabled\n" );
+
+ keepLights = game->keepLights;
+ if (keepLights == qtrue)
+ Sys_Printf( " keep lights: enabled\n" );
+ else
+ Sys_Printf( " keep lights: disabled\n" );
+
+ patchShadows = game->patchShadows;
+ if (patchShadows == qtrue)
+ Sys_Printf( " patch shadows: enabled\n" );
+ else
+ Sys_Printf( " patch shadows: disabled\n" );
+
+ deluxemap = game->deluxeMap;
+ deluxemode = game->deluxeMode;
+ if (deluxemap == qtrue)
+ {
+ if (deluxemode)
+ Sys_Printf( " deluxemapping: enabled with tangentspace deluxemaps\n" );
+ else
+ Sys_Printf( " deluxemapping: enabled with modelspace deluxemaps\n" );
+ }
+ else
+ Sys_Printf( " deluxemapping: disabled\n" );
+
+ Sys_Printf( "--- ProcessCommandLine ---\n" );
/* process commandline arguments */
for( i = 1; i < (argc - 1); i++ )
@@ -1827,6 +1948,22 @@
Sys_Printf( "All light scaled by %f\n", f );
i++;
}
+
+ else if( !strcmp( argv[ i ], "-gridscale" ) )
+ {
+ f = atof( argv[ i + 1 ] );
+ Sys_Printf( "Grid lightning scaled by %f\n", f );
+ gridScale *= f;
+ i++;
+ }
+
+ else if( !strcmp( argv[ i ], "-gridambientscale" ) )
+ {
+ f = atof( argv[ i + 1 ] );
+ Sys_Printf( "Grid ambient lightning scaled by %f\n", f );
+ gridAmbientScale *= f;
+ i++;
+ }
else if( !strcmp( argv[ i ], "-gamma" ) )
{
@@ -1836,6 +1973,14 @@
i++;
}
+ else if( !strcmp( argv[ i ], "-exposure" ) )
+ {
+ f = atof( argv[ i + 1 ] );
+ lightmapExposure = f;
+ Sys_Printf( "Lighting exposure set to %f\n", lightmapExposure );
+ i++;
+ }
+
else if( !strcmp( argv[ i ], "-compensate" ) )
{
f = atof( argv[ i + 1 ] );
@@ -1889,12 +2034,6 @@
Sys_Printf( "Dark lightmap seams enabled\n" );
}
-
-
-
-
-
-
else if( !strcmp( argv[ i ], "-shadeangle" ) )
{
shadeAngleDegrees = atof( argv[ i + 1 ] );
@@ -1927,13 +2066,28 @@
Sys_Printf( "Approximating lightmaps within a byte tolerance of %d\n", approximateTolerance );
i++;
}
-
else if( !strcmp( argv[ i ], "-deluxe" ) || !strcmp( argv[ i ], "-deluxemap" ) )
{
deluxemap = qtrue;
Sys_Printf( "Generating deluxemaps for average light direction\n" );
}
-
+ else if( !strcmp( argv[ i ], "-deluxemode" ))
+ {
+ deluxemode = atoi( argv[ i + 1 ] );
+ if (deluxemode == 0 || deluxemode > 1 || deluxemode < 0)
+ {
+ Sys_Printf( "Generating modelspace deluxemaps\n" );
+ deluxemode = 0;
+ }
+ else
+ Sys_Printf( "Generating tangentspace deluxemaps\n" );
+ i++;
+ }
+ else if( !strcmp( argv[ i ], "-nodeluxe" ) || !strcmp( argv[ i ], "-nodeluxemap" ) )
+ {
+ deluxemap = qfalse;
+ Sys_Printf( "Disabling generating of deluxemaps for average light direction\n" );
+ }
else if( !strcmp( argv[ i ], "-external" ) )
{
externalLightmaps = qtrue;
@@ -2151,6 +2305,12 @@
i++;
Sys_Printf( "Default lightmap sample size set to %dx%d units\n", sampleSize, sampleSize );
}
+ else if( !strcmp( argv[ i ], "-samplescale" ) )
+ {
+ sampleScale = atoi( argv[ i + 1 ] );
+ i++;
+ Sys_Printf( "Lightmaps sample scale set to %d\n", sampleScale);
+ }
else if( !strcmp( argv[ i ], "-novertex" ) )
{
noVertexLighting = qtrue;
@@ -2186,11 +2346,36 @@
noStyles = qtrue;
Sys_Printf( "Disabling lightstyles\n" );
}
+ else if( !strcmp( argv[ i ], "-style" ) || !strcmp( argv[ i ], "-styles" ) )
+ {
+ noStyles = qfalse;
+ Sys_Printf( "Enabling lightstyles\n" );
+ }
+ else if( !strcmp( argv[ i ], "-keeplights" ))
+ {
+ keepLights = qtrue;
+ Sys_Printf( "Leaving light entities on map after compile\n" );
+ }
else if( !strcmp( argv[ i ], "-cpma" ) )
{
cpmaHack = qtrue;
Sys_Printf( "Enabling Challenge Pro Mode Asstacular Vertex Lighting Mode (tm)\n" );
}
+ else if( !strcmp( argv[ i ], "-floodlight" ) )
+ {
+ floodlighty = qtrue;
+ Sys_Printf( "FloodLighting enabled\n" );
+ }
+ else if( !strcmp( argv[ i ], "-debugnormals" ) )
+ {
+ debugnormals = qtrue;
+ Sys_Printf( "DebugNormals enabled\n" );
+ }
+ else if( !strcmp( argv[ i ], "-lowquality" ) )
+ {
+ floodlight_lowquality = qtrue;
+ Sys_Printf( "Low Quality FloodLighting enabled\n" );
+ }
/* r7: dirtmapping */
else if( !strcmp( argv[ i ], "-dirty" ) )
@@ -2212,6 +2397,7 @@
Sys_Printf( "Enabling randomized dirtmapping\n" );
else
Sys_Printf( "Enabling ordered dir mapping\n" );
+ i++;
}
else if( !strcmp( argv[ i ], "-dirtdepth" ) )
{
@@ -2219,6 +2405,7 @@
if( dirtDepth <= 0.0f )
dirtDepth = 128.0f;
Sys_Printf( "Dirtmapping depth set to %.1f\n", dirtDepth );
+ i++;
}
else if( !strcmp( argv[ i ], "-dirtscale" ) )
{
@@ -2226,6 +2413,7 @@
if( dirtScale <= 0.0f )
dirtScale = 1.0f;
Sys_Printf( "Dirtmapping scale set to %.1f\n", dirtScale );
+ i++;
}
else if( !strcmp( argv[ i ], "-dirtgain" ) )
{
@@ -2233,6 +2421,7 @@
if( dirtGain <= 0.0f )
dirtGain = 1.0f;
Sys_Printf( "Dirtmapping gain set to %.1f\n", dirtGain );
+ i++;
}
/* unhandled args */
@@ -2279,6 +2468,7 @@
/* ydnar: set up optimization */
SetupBrushes();
SetupDirt();
+ SetupFloodLight();
SetupSurfaceLightmaps();
/* initialize the surface facet tracing */
Index: light_bounce.c
===================================================================
--- light_bounce.c (revision 158)
+++ light_bounce.c (working copy)
@@ -510,7 +510,7 @@
break;
case MST_TRIANGLE_SOUP:
- numTriangleDiffuseLights;
+ numTriangleDiffuseLights++;
break;
case MST_PATCH:
Index: light_trace.c
===================================================================
--- light_trace.c (revision 158)
+++ light_trace.c (working copy)
@@ -56,7 +56,7 @@
#define GROW_TRACE_NODES 16384 //% 16384
#define GROW_NODE_ITEMS 16 //% 256
-#define MAX_TW_VERTS 12
+#define MAX_TW_VERTS 24 // vortex: increased from 12 to 24 for ability co compile some insane maps with large curve count
#define TRACE_ON_EPSILON 0.1f
Index: light_ydnar.c
===================================================================
--- light_ydnar.c (revision 158)
+++ light_ydnar.c (working copy)
@@ -49,6 +49,7 @@
int i;
float max, gamma;
vec3_t sample;
+ float inv, dif;
/* ydnar: scaling necessary for simulating r_overbrightBits on external lightmaps */
@@ -72,16 +73,51 @@
/* gamma */
sample[ i ] = pow( sample[ i ] / 255.0f, gamma ) * 255.0f;
}
+
+ if (lightmapExposure == 1)
+ {
+ /* clamp with color normalization */
+ max = sample[ 0 ];
+ if( sample[ 1 ] > max )
+ max = sample[ 1 ];
+ if( sample[ 2 ] > max )
+ max = sample[ 2 ];
+ if( max > 255.0f )
+ VectorScale( sample, (255.0f / max), sample );
+ }
+ else
+ {
+ if (lightmapExposure==0)
+ {
+ lightmapExposure=1.0f;
+ }
+ inv=1.f/lightmapExposure;
+ //Exposure
+
+ max = sample[ 0 ];
+ if( sample[ 1 ] > max )
+ max = sample[ 1 ];
+ if( sample[ 2 ] > max )
+ max = sample[ 2 ];
+
+ dif = (1- exp(-max * inv) ) * 255;
+
+ if (max >0)
+ {
+ dif = dif / max;
+ }
+ else
+ {
+ dif = 0;
+ }
+
+ for (i=0;i<3;i++)
+ {
+ sample[i]*=dif;
+ }
+ }
+
- /* clamp with color normalization */
- max = sample[ 0 ];
- if( sample[ 1 ] > max )
- max = sample[ 1 ];
- if( sample[ 2 ] > max )
- max = sample[ 2 ];
- if( max > 255.0f )
- VectorScale( sample, (255.0f / max), sample );
-
/* compensate for ingame overbrighting/bitshifting */
VectorScale( sample, (1.0f / lightmapCompensate), sample );
@@ -384,7 +420,7 @@
#define NUDGE 0.5f
#define BOGUS_NUDGE -99999.0f
-static int MapSingleLuxel( rawLightmap_t *lm, surfaceInfo_t *info, bspDrawVert_t *dv, vec4_t plane, float pass, vec3_t stv[ 3 ], vec3_t ttv[ 3 ] )
+static int MapSingleLuxel( rawLightmap_t *lm, surfaceInfo_t *info, bspDrawVert_t *dv, vec4_t plane, float pass, vec3_t stv[ 3 ], vec3_t ttv[ 3 ], vec3_t worldverts[ 3 ] )
{
int i, x, y, numClusters, *clusters, pointCluster, *cluster;
float *luxel, *origin, *normal, d, lightmapSampleOffset;
@@ -392,6 +428,12 @@
vec3_t pNormal;
vec3_t vecs[ 3 ];
vec3_t nudged;
+ vec3_t cverts[ 3 ];
+ vec3_t temp;
+ vec4_t sideplane, hostplane;
+ vec3_t origintwo;
+ int j, next;
+ float e;
float *nudge;
static float nudges[][ 2 ] =
{
@@ -485,6 +527,51 @@
/* non axial lightmap projection (explicit xyz) */
else
VectorCopy( dv->xyz, origin );
+
+ //////////////////////
+ //27's test to make sure samples stay within the triangle boundaries
+ //1) Test the sample origin to see if it lays on the wrong side of any edge (x/y)
+ //2) if it does, nudge it onto the correct side.
+
+ if (worldverts!=NULL)
+ {
+ for (j=0;j<3;j++)
+ {
+ VectorCopy(worldverts[j],cverts[j]);
+ }
+ PlaneFromPoints(hostplane,cverts[0],cverts[1],cverts[2]);
+
+ for (j=0;j<3;j++)
+ {
+ for (i=0;i<3;i++)
+ {
+ //build plane using 2 edges and a normal
+ next=(i+1)%3;
+
+ VectorCopy(cverts[next],temp);
+ VectorAdd(temp,hostplane,temp);
+ PlaneFromPoints(sideplane,cverts[i],cverts[ next ], temp);
+
+ //planetest sample point
+ e=DotProduct(origin,sideplane);
+ e=e-sideplane[3];
+ if (e>0)
+ {
+ //we're bad.
+ //VectorClear(origin);
+ //Move the sample point back inside triangle bounds
+ origin[0]-=sideplane[0]*(e+1);
+ origin[1]-=sideplane[1]*(e+1);
+ origin[2]-=sideplane[2]*(e+1);
+#ifdef DEBUG_27_1
+ VectorClear(origin);
+#endif
+ }
+ }
+ }
+ }
+
+ ////////////////////////
/* planar surfaces have precalculated lightmap vectors for nudging */
if( lm->plane != NULL )
@@ -516,8 +603,13 @@
else
origin[ lm->axisNum ] += lightmapSampleOffset;
+ VectorCopy(origin,origintwo);
+ origintwo[0]+=vecs[2][0];
+ origintwo[1]+=vecs[2][1];
+ origintwo[2]+=vecs[2][2];
+
/* get cluster */
- pointCluster = ClusterForPointExtFilter( origin, LUXEL_EPSILON, numClusters, clusters );
+ pointCluster = ClusterForPointExtFilter( origintwo, LUXEL_EPSILON, numClusters, clusters );
/* another retarded hack, storing nudge count in luxel[ 1 ] */
luxel[ 1 ] = 0.0f;
@@ -533,14 +625,14 @@
for( i = 0; i < 3; i++ )
{
/* set nudged point*/
- nudged[ i ] = origin[ i ] + (nudge[ 0 ] * vecs[ 0 ][ i ]) + (nudge[ 1 ] * vecs[ 1 ][ i ]);
+ nudged[ i ] = origintwo[ i ] + (nudge[ 0 ] * vecs[ 0 ][ i ]) + (nudge[ 1 ] * vecs[ 1 ][ i ]);
}
nudge += 2;
/* get pvs cluster */
pointCluster = ClusterForPointExtFilter( nudged, LUXEL_EPSILON, numClusters, clusters ); //% + 0.625 );
- if( pointCluster >= 0 )
- VectorCopy( nudged, origin );
+ //if( pointCluster >= 0 )
+ // VectorCopy( nudged, origin );
luxel[ 1 ] += 1.0f;
}
}
@@ -550,8 +642,8 @@
{
VectorMA( dv->xyz, lightmapSampleOffset, dv->normal, nudged );
pointCluster = ClusterForPointExtFilter( nudged, LUXEL_EPSILON, numClusters, clusters );
- if( pointCluster >= 0 )
- VectorCopy( nudged, origin );
+ //if( pointCluster >= 0 )
+ // VectorCopy( nudged, origin );
luxel[ 1 ] += 1.0f;
}
@@ -597,7 +689,7 @@
than the distance between two luxels (thanks jc :)
*/
-static void MapTriangle_r( rawLightmap_t *lm, surfaceInfo_t *info, bspDrawVert_t *dv[ 3 ], vec4_t plane, vec3_t stv[ 3 ], vec3_t ttv[ 3 ] )
+static void MapTriangle_r( rawLightmap_t *lm, surfaceInfo_t *info, bspDrawVert_t *dv[ 3 ], vec4_t plane, vec3_t stv[ 3 ], vec3_t ttv[ 3 ], vec3_t worldverts[ 3 ] )
{
bspDrawVert_t mid, *dv2[ 3 ];
int max;
@@ -645,7 +737,7 @@
/* split the longest edge and map it */
LerpDrawVert( dv[ max ], dv[ (max + 1) % 3 ], &mid );
- MapSingleLuxel( lm, info, &mid, plane, 1, stv, ttv );
+ MapSingleLuxel( lm, info, &mid, plane, 1, stv, ttv, worldverts );
/* push the point up a little bit to account for fp creep (fixme: revisit this) */
//% VectorMA( mid.xyz, 2.0f, mid.normal, mid.xyz );
@@ -653,12 +745,12 @@
/* recurse to first triangle */
VectorCopy( dv, dv2 );
dv2[ max ] = &mid;
- MapTriangle_r( lm, info, dv2, plane, stv, ttv );
+ MapTriangle_r( lm, info, dv2, plane, stv, ttv, worldverts );
/* recurse to second triangle */
VectorCopy( dv, dv2 );
dv2[ (max + 1) % 3 ] = &mid;
- MapTriangle_r( lm, info, dv2, plane, stv, ttv );
+ MapTriangle_r( lm, info, dv2, plane, stv, ttv, worldverts );
}
@@ -674,8 +766,8 @@
int i;
vec4_t plane;
vec3_t *stv, *ttv, stvStatic[ 3 ], ttvStatic[ 3 ];
+ vec3_t worldverts[ 3 ];
-
/* get plane if possible */
if( lm->plane != NULL )
{
@@ -699,16 +791,20 @@
ttv = NULL;
}
+ VectorCopy( dv[ 0 ]->xyz, worldverts[ 0 ] );
+ VectorCopy( dv[ 1 ]->xyz, worldverts[ 1 ] );
+ VectorCopy( dv[ 2 ]->xyz, worldverts[ 2 ] );
+
/* map the vertexes */
- MapSingleLuxel( lm, info, dv[ 0 ], plane, 1, stv, ttv );
- MapSingleLuxel( lm, info, dv[ 1 ], plane, 1, stv, ttv );
- MapSingleLuxel( lm, info, dv[ 2 ], plane, 1, stv, ttv );
+ MapSingleLuxel( lm, info, dv[ 0 ], plane, 1, stv, ttv, worldverts );
+ MapSingleLuxel( lm, info, dv[ 1 ], plane, 1, stv, ttv, worldverts );
+ MapSingleLuxel( lm, info, dv[ 2 ], plane, 1, stv, ttv, worldverts );
/* 2002-11-20: prefer axial triangle edges */
if( mapNonAxial )
{
/* subdivide the triangle */
- MapTriangle_r( lm, info, dv, plane, stv, ttv );
+ MapTriangle_r( lm, info, dv, plane, stv, ttv, worldverts );
return qtrue;
}
@@ -730,7 +826,7 @@
dv2[ 2 ] = dv[ (i + 1) % 3 ];
/* map the degenerate triangle */
- MapTriangle_r( lm, info, dv2, plane, stv, ttv );
+ MapTriangle_r( lm, info, dv2, plane, stv, ttv, worldverts );
}
}
@@ -792,8 +888,8 @@
LerpDrawVert( dv[ max + 2 ], dv[ (max + 3) % 4 ], &mid[ 1 ] );
/* map the vertexes */
- MapSingleLuxel( lm, info, &mid[ 0 ], plane, 1, stv, ttv );
- MapSingleLuxel( lm, info, &mid[ 1 ], plane, 1, stv, ttv );
+ MapSingleLuxel( lm, info, &mid[ 0 ], plane, 1, stv, ttv, NULL );
+ MapSingleLuxel( lm, info, &mid[ 1 ], plane, 1, stv, ttv, NULL );
/* 0 and 2 */
if( max == 0 )
@@ -848,7 +944,6 @@
vec4_t plane;
vec3_t *stv, *ttv, stvStatic[ 4 ], ttvStatic[ 4 ];
-
/* get plane if possible */
if( lm->plane != NULL )
{
@@ -878,18 +973,16 @@
}
/* map the vertexes */
- MapSingleLuxel( lm, info, dv[ 0 ], plane, 1, stv, ttv );
- MapSingleLuxel( lm, info, dv[ 1 ], plane, 1, stv, ttv );
- MapSingleLuxel( lm, info, dv[ 2 ], plane, 1, stv, ttv );
- MapSingleLuxel( lm, info, dv[ 3 ], plane, 1, stv, ttv );
+ MapSingleLuxel( lm, info, dv[ 0 ], plane, 1, stv, ttv, NULL );
+ MapSingleLuxel( lm, info, dv[ 1 ], plane, 1, stv, ttv, NULL );
+ MapSingleLuxel( lm, info, dv[ 2 ], plane, 1, stv, ttv, NULL );
+ MapSingleLuxel( lm, info, dv[ 3 ], plane, 1, stv, ttv, NULL );
/* subdivide the quad */
MapQuad_r( lm, info, dv, plane, stv, ttv );
return qtrue;
}
-
-
/*
MapRawLightmap()
maps the locations, normals, and pvs clusters for a raw lightmap
@@ -941,7 +1034,7 @@
num = lightSurfaces[ lm->firstLightSurface + n ];
ds = &bspDrawSurfaces[ num ];
info = &surfaceInfos[ num ];
-
+
/* bail if no lightmap to calculate */
if( info->lm != lm )
{
@@ -1173,7 +1266,7 @@
continue;
/* map the fake vert */
- MapSingleLuxel( lm, NULL, &fake, lm->plane, pass, NULL, NULL );
+ MapSingleLuxel( lm, NULL, &fake, lm->plane, pass, NULL, NULL, NULL );
}
}
}
@@ -1596,7 +1689,6 @@
VectorSubtract( origin2, origin, originVecs[ 0 ] );
//% VectorSubtract( normal2, normal, normalVecs[ 0 ] );
-
/* calulate y vector */
if( (y < (lm->sh - 1) && bx >= 0.0f) || (y == 0 && bx <= 0.0f) )
{
@@ -1660,7 +1752,6 @@
float biasDirs[ 4 ][ 2 ] = { { -1.0f, -1.0f }, { 1.0f, -1.0f }, { -1.0f, 1.0f }, { 1.0f, 1.0f } };
vec3_t color, total;
-
/* limit check */
if( lightLuxel[ 3 ] >= lightSamples )
return;
@@ -1693,7 +1784,6 @@
VectorCopy( normal[ b ], trace->normal );
/* sample light */
-
LightContributionToSample( trace );
/* add to totals (fixme: make contrast function) */
@@ -1768,7 +1858,6 @@
trace_t trace;
float stackLightLuxels[ STACK_LL_SIZE ];
-
/* bail if this number exceeds the number of raw lightmaps */
if( rawLightmapNum >= numRawLightmaps )
return;
@@ -1904,7 +1993,7 @@
else
{
VectorCopy( ambientColor, luxel );
- if( deluxemap )
+ if( deluxemap)
VectorScale( normal, 0.00390625f, deluxel );
luxel[ 3 ] = 1.0f;
}
@@ -1963,28 +2052,39 @@
deluxel = SUPER_DELUXEL( x, y );
origin = SUPER_ORIGIN( x, y );
normal = SUPER_NORMAL( x, y );
-
- /* set contribution count */
- lightLuxel[ 3 ] = 1.0f;
-
- /* setup trace */
- trace.cluster = *cluster;
- VectorCopy( origin, trace.origin );
- VectorCopy( normal, trace.normal );
-
- /* get light for this sample */
- LightContributionToSample( &trace );
- VectorCopy( trace.color, lightLuxel );
-
- /* add to count */
- if( trace.color[ 0 ] || trace.color[ 1 ] || trace.color[ 2 ] )
+
+ ////////// 27's temp hack for testing edge clipping ////
+ if( origin[0]==0 && origin[1]==0 && origin[2]==0 )
+ {
+ lightLuxel[ 1 ] = 255;
+ lightLuxel[ 3 ] = 1.0f;
totalLighted++;
+ }
+ else
+ {
+ /* set contribution count */
+ lightLuxel[ 3 ] = 1.0f;
+
+ /* setup trace */
+ trace.cluster = *cluster;
+ VectorCopy( origin, trace.origin );
+ VectorCopy( normal, trace.normal );
+
+ /* get light for this sample */
+ LightContributionToSample( &trace );
+ VectorCopy( trace.color, lightLuxel );
+
+ /* add to count */
+ if( trace.color[ 0 ] || trace.color[ 1 ] || trace.color[ 2 ] )
+ totalLighted++;
+ }
/* add to light direction map (fixme: use luxel normal as starting point for deluxel?) */
if( deluxemap )
{
+ /* vortex: use noShadow color */
/* color to grayscale (photoshop rgb weighting) */
- brightness = trace.color[ 0 ] * 0.3f + trace.color[ 1 ] * 0.59f + trace.color[ 2 ] * 0.11f;
+ brightness = trace.colorNoShadow[ 0 ] * 0.3f + trace.colorNoShadow[ 1 ] * 0.59f + trace.colorNoShadow[ 2 ] * 0.11f;
brightness *= (1.0 / 255.0);
VectorScale( trace.direction, brightness, trace.direction );
VectorAdd( deluxel, trace.direction, deluxel );
@@ -2222,6 +2322,38 @@
/* free light list */
FreeTraceLights( &trace );
+ /* floodlight pass */
+ FloodlightIlluminateLightmap(lm);
+
+ if (debugnormals)
+ {
+ for( lightmapNum = 0; lightmapNum < MAX_LIGHTMAPS; lightmapNum++ )
+ {
+ /* early out */
+ if( lm->superLuxels[ lightmapNum ] == NULL )
+ continue;
+
+ for( y = 0; y < lm->sh; y++ )
+ {
+ for( x = 0; x < lm->sw; x++ )
+ {
+ /* get cluster */
+ cluster = SUPER_CLUSTER( x, y );
+ //% if( *cluster < 0 )
+ //% continue;
+
+ /* get particulars */
+ luxel = SUPER_LUXEL( lightmapNum, x, y );
+ normal = SUPER_NORMAL ( x, y );
+
+ luxel[0]=(normal[0]*127)+127;
+ luxel[1]=(normal[1]*127)+127;
+ luxel[2]=(normal[2]*127)+127;
+ }
+ }
+ }
+ }
+
/* -----------------------------------------------------------------
dirt pass
----------------------------------------------------------------- */
@@ -2263,7 +2395,7 @@
/* -----------------------------------------------------------------
filter pass
----------------------------------------------------------------- */
-
+
/* walk lightmaps */
for( lightmapNum = 0; lightmapNum < MAX_LIGHTMAPS; lightmapNum++ )
{
@@ -3112,7 +3244,7 @@
int i, x, y, z, x1, y1, z1;
light_t *light, *light2, **owner;
bspLeaf_t *leaf;
- vec3_t origin, dir, mins, maxs, nullVector = { 0, 0, 0 };
+ vec3_t origin, dir, mins, maxs;
float radius, intensity;
light_t *buckets[ 256 ];
@@ -3587,7 +3719,430 @@
CreateTraceLightsForBounds( mins, maxs, normal, info->numSurfaceClusters, &surfaceClusters[ info->firstSurfaceCluster ], LIGHT_SURFACES, trace );
}
+/////////////////////////////////////////////////////////////
+#define FLOODLIGHT_CONE_ANGLE 88 /* degrees */
+#define FLOODLIGHT_NUM_ANGLE_STEPS 16
+#define FLOODLIGHT_NUM_ELEVATION_STEPS 4
+#define FLOODLIGHT_NUM_VECTORS (FLOODLIGHT_NUM_ANGLE_STEPS * FLOODLIGHT_NUM_ELEVATION_STEPS)
+static vec3_t floodVectors[ FLOODLIGHT_NUM_VECTORS ];
+static int numFloodVectors = 0;
+void SetupFloodLight( void )
+{
+ int i, j;
+ float angle, elevation, angleStep, elevationStep;
+ const char *value;
+ double v1,v2,v3,v4,v5;
+
+ /* note it */
+ Sys_FPrintf( SYS_VRB, "--- SetupFloodLight ---\n" );
+
+ /* calculate angular steps */
+ angleStep = DEG2RAD( 360.0f / FLOODLIGHT_NUM_ANGLE_STEPS );
+ elevationStep = DEG2RAD( FLOODLIGHT_CONE_ANGLE / FLOODLIGHT_NUM_ELEVATION_STEPS );
+
+ /* iterate angle */
+ angle = 0.0f;
+ for( i = 0, angle = 0.0f; i < FLOODLIGHT_NUM_ANGLE_STEPS; i++, angle += angleStep )
+ {
+ /* iterate elevation */
+ for( j = 0, elevation = elevationStep * 0.5f; j < FLOODLIGHT_NUM_ELEVATION_STEPS; j++, elevation += elevationStep )
+ {
+ floodVectors[ numFloodVectors ][ 0 ] = sin( elevation ) * cos( angle );
+ floodVectors[ numFloodVectors ][ 1 ] = sin( elevation ) * sin( angle );
+ floodVectors[ numFloodVectors ][ 2 ] = cos( elevation );
+ numFloodVectors++;
+ }
+ }
+
+ /* emit some statistics */
+ Sys_FPrintf( SYS_VRB, "%9d numFloodVectors\n", numFloodVectors );
+ /* floodlight */
+ value = ValueForKey( &entities[ 0 ], "_floodlight" );
+
+ if( value[ 0 ] != '\0' )
+ {
+ v1=v2=v3=0;
+ v4=floodlightDistance;
+ v5=floodlightIntensity;
+
+ sscanf( value, "%lf %lf %lf %lf %lf", &v1, &v2, &v3, &v4, &v5);
+
+ floodlightRGB[0]=v1;
+ floodlightRGB[1]=v2;
+ floodlightRGB[2]=v3;
+
+ if (VectorLength(floodlightRGB)==0)
+ {
+ VectorSet(floodlightRGB,240,240,255);
+ }
+
+ if (v4<1) v4=1024;
+ if (v5<1) v5=128;
+
+ floodlightDistance = v4;
+ floodlightIntensity = v5;
+
+ floodlighty = qtrue;
+ Sys_Printf( "FloodLighting enabled via worldspawn _floodlight key.\n" );
+ }
+ else
+ {
+ VectorSet(floodlightRGB,240,240,255);
+ //floodlighty = qtrue;
+ //Sys_Printf( "FloodLighting enabled via worldspawn _floodlight key.\n" );
+ }
+ VectorNormalize(floodlightRGB,floodlightRGB);
+}
+
+/*
+FloodLightForSample()
+calculates floodlight value for a given sample
+once again, kudos to the dirtmapping coder
+*/
+
+float FloodLightForSample( trace_t *trace , float floodLightDistance, qboolean floodLightLowQuality)
+{
+ int i;
+ float d;
+ float contribution;
+ int sub = 0;
+ float gatherLight, outLight;
+ vec3_t normal, worldUp, myUp, myRt, direction, displacement;
+ float dd;
+ int vecs = 0;
+
+ gatherLight=0;
+ /* dummy check */
+ //if( !dirty )
+ // return 1.0f;
+ if( trace == NULL || trace->cluster < 0 )
+ return 0.0f;
+
+
+ /* setup */
+ dd = floodLightDistance;
+ VectorCopy( trace->normal, normal );
+
+ /* check if the normal is aligned to the world-up */
+ if( normal[ 0 ] == 0.0f && normal[ 1 ] == 0.0f )
+ {
+ if( normal[ 2 ] == 1.0f )
+ {
+ VectorSet( myRt, 1.0f, 0.0f, 0.0f );
+ VectorSet( myUp, 0.0f, 1.0f, 0.0f );
+ }
+ else if( normal[ 2 ] == -1.0f )
+ {
+ VectorSet( myRt, -1.0f, 0.0f, 0.0f );
+ VectorSet( myUp, 0.0f, 1.0f, 0.0f );
+ }
+ }
+ else
+ {
+ VectorSet( worldUp, 0.0f, 0.0f, 1.0f );
+ CrossProduct( normal, worldUp, myRt );
+ VectorNormalize( myRt, myRt );
+ CrossProduct( myRt, normal, myUp );
+ VectorNormalize( myUp, myUp );
+ }
+
+ /* vortex: optimise floodLightLowQuality a bit */
+ if ( floodLightLowQuality == qtrue )
+ {
+ /* iterate through ordered vectors */
+ for( i = 0; i < numFloodVectors; i++ )
+ if (rand()%10 != 0 ) continue;
+ }
+ else
+ {
+ /* iterate through ordered vectors */
+ for( i = 0; i < numFloodVectors; i++ )
+ {
+ vecs++;
+
+ /* transform vector into tangent space */
+ direction[ 0 ] = myRt[ 0 ] * floodVectors[ i ][ 0 ] + myUp[ 0 ] * floodVectors[ i ][ 1 ] + normal[ 0 ] * floodVectors[ i ][ 2 ];
+ direction[ 1 ] = myRt[ 1 ] * floodVectors[ i ][ 0 ] + myUp[ 1 ] * floodVectors[ i ][ 1 ] + normal[ 1 ] * floodVectors[ i ][ 2 ];
+ direction[ 2 ] = myRt[ 2 ] * floodVectors[ i ][ 0 ] + myUp[ 2 ] * floodVectors[ i ][ 1 ] + normal[ 2 ] * floodVectors[ i ][ 2 ];
+
+ /* set endpoint */
+ VectorMA( trace->origin, dd, direction, trace->end );
+
+ //VectorMA( trace->origin, 1, direction, trace->origin );
+
+ SetupTrace( trace );
+ /* trace */
+ TraceLine( trace );
+ contribution=1;
+
+ if (trace->compileFlags & C_SKY )
+ {
+ contribution=1.0f;
+ }
+ else if ( trace->opaque )
+ {
+ VectorSubtract( trace->hit, trace->origin, displacement );
+ d=VectorLength( displacement );
+
+ // d=trace->distance;
+ //if (d>256) gatherDirt+=1;
+ contribution=d/dd;
+ if (contribution>1) contribution=1.0f;
+
+ //gatherDirt += 1.0f - ooDepth * VectorLength( displacement );
+ }
+
+ gatherLight+=contribution;
+ }
+ }
+
+ /* early out */
+ if( gatherLight <= 0.0f )
+ return 0.0f;
+
+ sub=vecs;
+
+ if (sub<1) sub=1;
+ gatherLight/=(sub);
+
+ outLight=gatherLight;
+ if( outLight > 1.0f )
+ outLight = 1.0f;
+
+ /* return to sender */
+ return outLight;
+}
+
+/*
+FloodLightRawLightmap
+lighttracer style ambient occlusion light hack.
+Kudos to the dirtmapping author for most of this source.
+VorteX: modified to floodlight up custom surfaces (q3map_floodLight)
+VorteX: fixed problems with deluxemapping
+*/
+
+// floodlight pass on a lightmap
+void FloodLightRawLightmapPass( rawLightmap_t *lm , vec3_t lmFloodLightRGB, float lmFloodLightIntensity, float lmFloodLightDistance, qboolean lmFloodLightLowQuality, float floodlightDirectionScale)
+{
+ int i, x, y, *cluster;
+ float *origin, *normal, *floodlight, floodLightAmount;
+ surfaceInfo_t *info;
+ trace_t trace;
+ // int sx, sy;
+ // float samples, average, *floodlight2;
+
+ memset(&trace,0,sizeof(trace_t));
+
+ /* setup trace */
+ trace.testOcclusion = qtrue;
+ trace.forceSunlight = qfalse;
+ trace.twoSided = qtrue;
+ trace.recvShadows = lm->recvShadows;
+ trace.numSurfaces = lm->numLightSurfaces;
+ trace.surfaces = &lightSurfaces[ lm->firstLightSurface ];
+ trace.inhibitRadius = DEFAULT_INHIBIT_RADIUS;
+ trace.testAll = qfalse;
+ trace.distance = 1024;
+
+ /* twosided lighting (may or may not be a good idea for lightmapped stuff) */
+ //trace.twoSided = qfalse;
+ for( i = 0; i < trace.numSurfaces; i++ )
+ {
+ /* get surface */
+ info = &surfaceInfos[ trace.surfaces[ i ] ];
+
+ /* check twosidedness */
+ if( info->si->twoSided )
+ {
+ trace.twoSided = qtrue;
+ break;
+ }
+ }
+
+ /* gather floodlight */
+ for( y = 0; y < lm->sh; y++ )
+ {
+ for( x = 0; x < lm->sw; x++ )
+ {
+ /* get luxel */
+ cluster = SUPER_CLUSTER( x, y );
+ origin = SUPER_ORIGIN( x, y );
+ normal = SUPER_NORMAL( x, y );
+ floodlight = SUPER_FLOODLIGHT( x, y );
+
+ /* set default dirt */
+ *floodlight = 0.0f;
+
+ /* only look at mapped luxels */
+ if( *cluster < 0 )
+ continue;
+
+ /* copy to trace */
+ trace.cluster = *cluster;
+ VectorCopy( origin, trace.origin );
+ VectorCopy( normal, trace.normal );
+
+ /* get floodlight */
+ floodLightAmount = FloodLightForSample( &trace , lmFloodLightDistance, lmFloodLightLowQuality)*lmFloodLightIntensity;
+
+ /* add floodlight */
+ floodlight[0] += lmFloodLightRGB[0]*floodLightAmount;
+ floodlight[1] += lmFloodLightRGB[1]*floodLightAmount;
+ floodlight[2] += lmFloodLightRGB[2]*floodLightAmount;
+ floodlight[3] += floodlightDirectionScale;
+ }
+ }
+
+ /* testing no filtering */
+ return;
+
+#if 0
+
+ /* filter "dirt" */
+ for( y = 0; y < lm->sh; y++ )
+ {
+ for( x = 0; x < lm->sw; x++ )
+ {
+ /* get luxel */
+ cluster = SUPER_CLUSTER( x, y );
+ floodlight = SUPER_FLOODLIGHT(x, y );
+
+ /* filter dirt by adjacency to unmapped luxels */
+ average = *floodlight;
+ samples = 1.0f;
+ for( sy = (y - 1); sy <= (y + 1); sy++ )
+ {
+ if( sy < 0 || sy >= lm->sh )
+ continue;
+
+ for( sx = (x - 1); sx <= (x + 1); sx++ )
+ {
+ if( sx < 0 || sx >= lm->sw || (sx == x && sy == y) )
+ continue;
+
+ /* get neighboring luxel */
+ cluster = SUPER_CLUSTER( sx, sy );
+ floodlight2 = SUPER_FLOODLIGHT( sx, sy );
+ if( *cluster < 0 || *floodlight2 <= 0.0f )
+ continue;
+
+ /* add it */
+ average += *floodlight2;
+ samples += 1.0f;
+ }
+
+ /* bail */
+ if( samples <= 0.0f )
+ break;
+ }
+
+ /* bail */
+ if( samples <= 0.0f )
+ continue;
+
+ /* scale dirt */
+ *floodlight = average / samples;
+ }
+ }
+#endif
+}
+
+void FloodLightRawLightmap( int rawLightmapNum )
+{
+ rawLightmap_t *lm;
+
+ /* bail if this number exceeds the number of raw lightmaps */
+ if( rawLightmapNum >= numRawLightmaps )
+ return;
+ /* get lightmap */
+ lm = &rawLightmaps[ rawLightmapNum ];
+
+ /* global pass */
+ if (floodlighty && floodlightIntensity)
+ FloodLightRawLightmapPass(lm, floodlightRGB, floodlightIntensity, floodlightDistance, floodlight_lowquality, 0);
+
+ /* custom pass */
+ if (lm->floodlightIntensity)
+ {
+ FloodLightRawLightmapPass(lm, lm->floodlightRGB, lm->floodlightIntensity, lm->floodlightDistance, qfalse, lm->floodlightDirectionScale);
+ numSurfacesFloodlighten += 1;
+ }
+}
+
+void FloodlightRawLightmaps()
+{
+ Sys_Printf( "--- FloodlightRawLightmap ---\n" );
+ numSurfacesFloodlighten = 0;
+ RunThreadsOnIndividual( numRawLightmaps, qtrue, FloodLightRawLightmap );
+ Sys_Printf( "%9d custom lightmaps floodlighted\n", numSurfacesFloodlighten );
+}
+
+/*
+FloodLightIlluminate()
+illuminate floodlight into lightmap luxels
+*/
+
+void FloodlightIlluminateLightmap( rawLightmap_t *lm )
+{
+ float *luxel, *floodlight, *deluxel, *normal;
+ int *cluster;
+ float brightness;
+ vec3_t lightvector;
+ int x, y, lightmapNum;
+
+ /* walk lightmaps */
+ for( lightmapNum = 0; lightmapNum < MAX_LIGHTMAPS; lightmapNum++ )
+ {
+ /* early out */
+ if( lm->superLuxels[ lightmapNum ] == NULL )
+ continue;
+
+ /* apply floodlight to each luxel */
+ for( y = 0; y < lm->sh; y++ )
+ {
+ for( x = 0; x < lm->sw; x++ )
+ {
+ /* get floodlight */
+ floodlight = SUPER_FLOODLIGHT( x, y );
+ if (!floodlight[0] && !floodlight[1] && !floodlight[2])
+ continue;
+
+ /* get cluster */
+ cluster = SUPER_CLUSTER( x, y );
+
+ /* only process mapped luxels */
+ if( *cluster < 0 )
+ continue;
+
+ /* get particulars */
+ luxel = SUPER_LUXEL( lightmapNum, x, y );
+ deluxel = SUPER_DELUXEL( x, y );
+
+ /* add to lightmap */
+ luxel[0]+=floodlight[0];
+ luxel[1]+=floodlight[1];
+ luxel[2]+=floodlight[2];
+
+ if (luxel[3]==0) luxel[3]=1;
+
+ /* add to deluxemap */
+ if (deluxemap && floodlight[3] > 0)
+ {
+ normal = SUPER_NORMAL( x, y );
+ brightness = floodlight[ 0 ] * 0.3f + floodlight[ 1 ] * 0.59f + floodlight[ 2 ] * 0.11f;
+ brightness *= ( 1.0f / 255.0f ) * floodlight[3];
+ VectorScale( normal, brightness, lightvector );
+ VectorAdd( deluxel, lightvector, deluxel );
+ }
+ }
+ }
+ }
+}
+
+
+
+
Index: lightmaps_ydnar.c
===================================================================
--- lightmaps_ydnar.c (revision 158)
+++ lightmaps_ydnar.c (working copy)
@@ -414,6 +414,12 @@
lm->superNormals = safe_malloc( size );
memset( lm->superNormals, 0, size );
+ /* allocate floodlight map storage */
+ size = lm->sw * lm->sh * SUPER_FLOODLIGHT_SIZE * sizeof( float );
+ if( lm->superFloodLight == NULL )
+ lm->superFloodLight = safe_malloc( size );
+ memset( lm->superFloodLight, 0, size );
+
/* allocate cluster map storage */
size = lm->sw * lm->sh * sizeof( int );
if( lm->superClusters == NULL )
@@ -1087,17 +1093,25 @@
/* allocate a new raw lightmap */
lm = &rawLightmaps[ numRawLightmaps ];
numRawLightmaps++;
-
+
/* set it up */
lm->splotchFix = info->si->splotchFix;
lm->firstLightSurface = numLightSurfaces;
lm->numLightSurfaces = 0;
- lm->sampleSize = info->sampleSize;
- lm->actualSampleSize = info->sampleSize;
+ /* vortex: multiply lightmap sample size by -samplescale */
+ if (sampleScale > 0)
+ lm->sampleSize = info->sampleSize*sampleScale;
+ else
+ lm->sampleSize = info->sampleSize;
+ lm->actualSampleSize = lm->sampleSize;
lm->entityNum = info->entityNum;
lm->recvShadows = info->recvShadows;
lm->brightness = info->si->lmBrightness;
lm->filterRadius = info->si->lmFilterRadius;
+ VectorCopy(info->si->floodlightRGB, lm->floodlightRGB);
+ lm->floodlightDistance = info->si->floodlightDistance;
+ lm->floodlightIntensity = info->si->floodlightIntensity;
+ lm->floodlightDirectionScale = info->si->floodlightDirectionScale;
VectorCopy( info->axis, lm->axis );
lm->plane = info->plane;
VectorCopy( info->mins, lm->mins );
@@ -2254,7 +2268,6 @@
char *rgbGenValues[ 256 ];
char *alphaGenValues[ 256 ];
-
/* note it */
Sys_Printf( "--- StoreSurfaceLightmaps ---\n");
@@ -2269,7 +2282,7 @@
----------------------------------------------------------------- */
/* note it */
- Sys_FPrintf( SYS_VRB, "Subsampling..." );
+ Sys_Printf( "Subsampling..." );
/* walk the list of raw lightmaps */
numUsed = 0;
@@ -2437,11 +2450,11 @@
/* get luxels */
luxel = SUPER_LUXEL( lightmapNum, x, y );
deluxel = SUPER_DELUXEL( x, y );
-
+
/* copy light direction */
if( deluxemap && lightmapNum == 0 )
VectorCopy( deluxel, dirSample );
-
+
/* is this a valid sample? */
if( luxel[ 3 ] > 0.0f )
{
@@ -2521,7 +2534,7 @@
/* store the sample in the bsp luxels */
bspLuxel = BSP_LUXEL( lightmapNum, x, y );
bspDeluxel = BSP_DELUXEL( x, y );
-
+
VectorAdd( bspLuxel, sample, bspLuxel );
if( deluxemap && lightmapNum == 0 )
VectorAdd( bspDeluxel, dirSample, bspDeluxel );
@@ -2562,7 +2575,7 @@
}
}
}
-
+
/* wrap bsp luxels if necessary */
if( lm->wrap[ 0 ] )
{
@@ -2604,15 +2617,144 @@
}
}
}
-
+
/* -----------------------------------------------------------------
+ convert modelspace deluxemaps to tangentspace
+ ----------------------------------------------------------------- */
+ /* note it */
+ if( !bouncing )
+ {
+ if( deluxemap && deluxemode == 1)
+ {
+ vec3_t worldUp, myNormal, myTangent, myBinormal;
+ float dist;
+
+ Sys_Printf( "converting..." );
+
+ for( i = 0; i < numRawLightmaps; i++ )
+ {
+ /* get lightmap */
+ lm = &rawLightmaps[ i ];
+
+ /* walk lightmap samples */
+ for( y = 0; y < lm->sh; y++ )
+ {
+ for( x = 0; x < lm->sw; x++ )
+ {
+ /* get normal and deluxel */
+ normal = SUPER_NORMAL(x, y);
+ cluster = SUPER_CLUSTER(x, y);
+ bspDeluxel = BSP_DELUXEL( x, y );
+ deluxel = SUPER_DELUXEL( x, y );
+
+ /* get normal */
+ VectorSet( myNormal, normal[0], normal[1], normal[2] );
+
+ /* get tangent vectors */
+ if( myNormal[ 0 ] == 0.0f && myNormal[ 1 ] == 0.0f )
+ {
+ if( myNormal[ 2 ] == 1.0f )
+ {
+ VectorSet( myTangent, 1.0f, 0.0f, 0.0f );
+ VectorSet( myBinormal, 0.0f, 1.0f, 0.0f );
+ }
+ else if( myNormal[ 2 ] == -1.0f )
+ {
+ VectorSet( myTangent, -1.0f, 0.0f, 0.0f );
+ VectorSet( myBinormal, 0.0f, 1.0f, 0.0f );
+ }
+ }
+ else
+ {
+ VectorSet( worldUp, 0.0f, 0.0f, 1.0f );
+ CrossProduct( myNormal, worldUp, myTangent );
+ VectorNormalize( myTangent, myTangent );
+ CrossProduct( myTangent, myNormal, myBinormal );
+ VectorNormalize( myBinormal, myBinormal );
+ }
+
+ /* project onto plane */
+ dist = -DotProduct(myTangent, myNormal);
+ VectorMA(myTangent, dist, myNormal, myTangent);
+ dist = -DotProduct(myBinormal, myNormal);
+ VectorMA(myBinormal, dist, myNormal, myBinormal);
+
+ /* renormalize */
+ VectorNormalize( myTangent, myTangent );
+ VectorNormalize( myBinormal, myBinormal );
+
+ /* convert modelspace deluxel to tangentspace */
+ dirSample[0] = bspDeluxel[0];
+ dirSample[1] = bspDeluxel[1];
+ dirSample[2] = bspDeluxel[2];
+ VectorNormalize(dirSample, dirSample);
+
+ /* fix tangents to world matrix */
+ if (myNormal[0] > 0 || myNormal[1] < 0 || myNormal[2] < 0)
+ VectorNegate(myTangent, myTangent);
+
+ /* build tangentspace vectors */
+ bspDeluxel[0] = DotProduct(dirSample, myTangent);
+ bspDeluxel[1] = DotProduct(dirSample, myBinormal);
+ bspDeluxel[2] = DotProduct(dirSample, myNormal);
+ }
+ }
+ }
+ }
+ }
+
+ /* -----------------------------------------------------------------
+ blend lightmaps
+ ----------------------------------------------------------------- */
+
+#ifdef sdfsdfwq312323
+ /* note it */
+ Sys_Printf( "blending..." );
+
+ for( i = 0; i < numRawLightmaps; i++ )
+ {
+ vec3_t myColor;
+ float myBrightness;
+
+ /* get lightmap */
+ lm = &rawLightmaps[ i ];
+
+ /* walk individual lightmaps */
+ for( lightmapNum = 0; lightmapNum < MAX_LIGHTMAPS; lightmapNum++ )
+ {
+ /* early outs */
+ if( lm->superLuxels[ lightmapNum ] == NULL )
+ continue;
+
+ /* walk lightmap samples */
+ for( y = 0; y < lm->sh; y++ )
+ {
+ for( x = 0; x < lm->sw; x++ )
+ {
+ /* get luxel */
+ bspLuxel = BSP_LUXEL( lightmapNum, x, y );
+
+ /* get color */
+ VectorNormalize(bspLuxel, myColor);
+ myBrightness = VectorLength(bspLuxel);
+ myBrightness *= (1 / 127.0f);
+ myBrightness = myBrightness*myBrightness;
+ myBrightness *= 127.0f;
+ VectorScale(myColor, myBrightness, bspLuxel);
+ }
+ }
+ }
+ }
+#endif
+
+ /* -----------------------------------------------------------------
collapse non-unique lightmaps
----------------------------------------------------------------- */
if( noCollapse == qfalse && deluxemap == qfalse )
{
/* note it */
- Sys_FPrintf( SYS_VRB, "collapsing..." );
+ Sys_Printf( "collapsing..." );
/* set all twin refs to null */
for( i = 0; i < numRawLightmaps; i++ )
@@ -2674,13 +2816,13 @@
}
}
}
-
+
/* -----------------------------------------------------------------
sort raw lightmaps by shader
----------------------------------------------------------------- */
/* note it */
- Sys_FPrintf( SYS_VRB, "sorting..." );
+ Sys_Printf( "sorting..." );
/* allocate a new sorted list */
if( sortLightmaps == NULL )
@@ -2696,7 +2838,7 @@
----------------------------------------------------------------- */
/* note it */
- Sys_FPrintf( SYS_VRB, "allocating..." );
+ Sys_Printf( "allocating..." );
/* kill all existing output lightmaps */
if( outLightmaps != NULL )
@@ -2749,7 +2891,7 @@
----------------------------------------------------------------- */
/* note it */
- Sys_FPrintf( SYS_VRB, "storing..." );
+ Sys_Printf( "storing..." );
/* count the bsp lightmaps and allocate space */
if( bspLightBytes != NULL )
@@ -2817,7 +2959,7 @@
}
if( numExtLightmaps > 0 )
- Sys_FPrintf( SYS_VRB, "\n" );
+ Sys_Printf( SYS_VRB, "\n" );
/* delete unused external lightmaps */
for( i = numExtLightmaps; i; i++ )
@@ -2836,7 +2978,7 @@
----------------------------------------------------------------- */
/* note it */
- Sys_FPrintf( SYS_VRB, "projecting..." );
+ Sys_Printf( "projecting..." );
/* walk the list of surfaces */
for( i = 0; i < numBSPDrawSurfaces; i++ )
@@ -3108,7 +3250,7 @@
}
/* finish */
- Sys_FPrintf( SYS_VRB, "done.\n" );
+ Sys_Printf( "done.\n" );
/* calc num stored */
numStored = numBSPLightBytes / 3;
Index: main.c
===================================================================
--- main.c (revision 158)
+++ main.c (working copy)
@@ -604,7 +604,7 @@
/* set exit call */
atexit( ExitQ3Map );
-
+
/* read general options first */
for( i = 1; i < argc; i++ )
{
@@ -680,6 +680,10 @@
/* ydnar: new path initialization */
InitPaths( &argc, argv );
+
+ /* set game options */
+ if (!patchSubdivisions)
+ patchSubdivisions = game->patchSubdivisions;
/* check if we have enough options left to attempt something */
if( argc < 2 )
Index: q3map2.h
===================================================================
--- q3map2.h (revision 158)
+++ q3map2.h (working copy)
@@ -35,8 +35,8 @@
/* version */
-#define Q3MAP_VERSION "2.5.17"
-#define Q3MAP_MOTD "Last one turns the lights off"
+#define Q3MAP_VERSION "2.5.17 base : FS_20g base : R5"
+#define Q3MAP_MOTD "Sorry, it doesn't match my furniture."
@@ -235,6 +235,7 @@
#define LIGHT_FAST_TEMP 512
#define LIGHT_FAST_ACTUAL (LIGHT_FAST | LIGHT_FAST_TEMP)
#define LIGHT_NEGATIVE 1024
+#define LIGHT_UNNORMALIZED 2048 /* vortex: do not normalize _color */
#define LIGHT_SUN_DEFAULT (LIGHT_ATTEN_ANGLE | LIGHT_GRID | LIGHT_SURFACES)
#define LIGHT_AREA_DEFAULT (LIGHT_ATTEN_ANGLE | LIGHT_ATTEN_DISTANCE | LIGHT_GRID | LIGHT_SURFACES) /* q3a and wolf are the same */
@@ -267,6 +268,7 @@
#define SUPER_NORMAL_SIZE 4
#define SUPER_DELUXEL_SIZE 3
#define BSP_DELUXEL_SIZE 3
+#define SUPER_FLOODLIGHT_SIZE 4
#define VERTEX_LUXEL( s, v ) (vertexLuxels[ s ] + ((v) * VERTEX_LUXEL_SIZE))
#define RAD_VERTEX_LUXEL( s, v )(radVertexLuxels[ s ] + ((v) * VERTEX_LUXEL_SIZE))
@@ -279,9 +281,8 @@
#define SUPER_ORIGIN( x, y ) (lm->superOrigins + ((((y) * lm->sw) + (x)) * SUPER_ORIGIN_SIZE))
#define SUPER_NORMAL( x, y ) (lm->superNormals + ((((y) * lm->sw) + (x)) * SUPER_NORMAL_SIZE))
#define SUPER_DIRT( x, y ) (lm->superNormals + ((((y) * lm->sw) + (x)) * SUPER_NORMAL_SIZE) + 3) /* stash dirtyness in normal[ 3 ] */
+#define SUPER_FLOODLIGHT(x, y ) (lm->superFloodLight + ((((y) * lm->sw) + (x)) * SUPER_FLOODLIGHT_SIZE))
-
-
/* -------------------------------------------------------------------------------
abstracted bsp file
@@ -543,7 +544,16 @@
qboolean wolfLight; /* when true, lights work like wolf q3map */
int lightmapSize; /* bsp lightmap width/height */
float lightmapGamma; /* default lightmap gamma */
+ float lightmapExposure; /* default lightmap exposure */
float lightmapCompensate; /* default lightmap compensate value */
+ float gridScale; /* vortex: default lightgrid scale (affects both directional and ambient spectres) */
+ float gridAmbientScale; /* vortex: default lightgrid ambient spectre scale */
+ qboolean noStyles; /* use lightstyles hack or not */
+ qboolean keepLights; /* keep light entities on bsp */
+ int patchSubdivisions; /* default patch subdivisions tolerance */
+ qboolean patchShadows; /* patch casting enabled */
+ qboolean deluxeMap; /* compile deluxemaps */
+ int deluxeMode; /* deluxemap mode (0 - modelspace, 1 - tangentspace with renormalization, 2 - tangentspace without renormalization) */
char *bspIdent; /* 4-letter bsp file prefix */
int bspVersion; /* bsp version to use */
qboolean lumpSwap; /* cod-style len/ofs order */
@@ -662,6 +672,7 @@
char *backShader; /* for surfaces that generate different front and back passes */
char *cloneShader; /* ydnar: for cloning of a surface */
char *remapShader; /* ydnar: remap a shader in final stage */
+ char *deprecateShader; /* vortex: shader is deprecated and replaced by this on use */
surfaceModel_t *surfaceModel; /* ydnar: for distribution of models */
foliage_t *foliage; /* ydnar/splash damage: wolf et foliage */
@@ -737,7 +748,13 @@
vec3_t color; /* normalized color */
vec3_t averageColor;
- byte lightStyle;
+ byte lightStyle;
+
+ /* vortex: per-surface floodlight */
+ float floodlightDirectionScale;
+ vec3_t floodlightRGB;
+ float floodlightIntensity;
+ float floodlightDistance;
qb_t lmMergable; /* ydnar */
int lmCustomWidth, lmCustomHeight; /* ydnar */
@@ -1013,7 +1030,7 @@
int maxIterations;
int patchWidth, patchHeight;
vec3_t bounds[ 2 ];
-
+
/* ydnar/sd: for foliage */
int numFoliageInstances;
@@ -1061,6 +1078,7 @@
int mapEntityNum, firstDrawSurf;
int firstBrush, numBrushes; /* only valid during BSP compile */
epair_t *epairs;
+ qboolean forceNormalSmoothing; /* vortex: true if entity has _smoothnormals/_sn/_smooth key */
}
entity_t;
@@ -1296,7 +1314,8 @@
/* input and output */
vec3_t color; /* starts out at full color, may be reduced if transparent surfaces are crossed */
-
+ vec3_t colorNoShadow; /* result color with no shadow casting */
+
/* output */
vec3_t hit;
int compileFlags; /* for determining surface compile flags traced through */
@@ -1367,6 +1386,13 @@
int numLightClusters, *lightClusters;
int sampleSize, actualSampleSize, axisNum;
+
+ /* vortex: per-surface floodlight */
+ float floodlightDirectionScale;
+ vec3_t floodlightRGB;
+ float floodlightIntensity;
+ float floodlightDistance;
+
int entityNum;
int recvShadows;
vec3_t mins, maxs, axis, origin, *vecs;
@@ -1389,9 +1415,9 @@
float *superOrigins;
float *superNormals;
int *superClusters;
-
float *superDeluxels; /* average light direction */
float *bspDeluxels;
+ float *superFloodLight; /* floodlight color */
}
rawLightmap_t;
@@ -1421,8 +1447,6 @@
}
surfaceInfo_t;
-
-
/* -------------------------------------------------------------------------------
prototypes
@@ -1556,6 +1580,7 @@
void ParsePatch( qboolean onlyLights );
mesh_t *SubdivideMesh( mesh_t in, float maxError, float minLength );
void PatchMapDrawSurfs( entity_t *e );
+void TriangulatePatchSurface( entity_t *e , mapDrawSurface_t *ds );
/* tjunction.c */
@@ -1610,6 +1635,8 @@
void AddEntitySurfaceModels( entity_t *e );
int AddSurfaceModels( mapDrawSurface_t *ds );
void FilterDrawsurfsIntoTree( entity_t *e, tree_t *tree );
+void EmitPatchSurface( entity_t *e, mapDrawSurface_t *ds );
+static void EmitTriangleSurface( mapDrawSurface_t *ds );
/* surface_fur.c */
@@ -1704,6 +1732,12 @@
float DirtForSample( trace_t *trace );
void DirtyRawLightmap( int num );
+void SetupFloodLight();
+void FloodlightRawLightmaps();
+void FloodlightIlluminateLightmap( rawLightmap_t *lm );
+float FloodLightForSample( trace_t *trace , float floodLightDistance, qboolean floodLightLowQuality);
+void FloodLightRawLightmap( int num );
+
void IlluminateRawLightmap( int num );
void IlluminateVertexes( int num );
@@ -1731,7 +1765,6 @@
void StitchSurfaceLightmaps( void );
void StoreSurfaceLightmaps( void );
-
/* image.c */
void ImageFree( image_t *image );
image_t *ImageFind( const char *filename );
@@ -1783,6 +1816,7 @@
void UnparseEntities( void );
void PrintEntity( const entity_t *ent );
void SetKeyValue( entity_t *ent, const char *key, const char *value );
+qboolean KeyExists( const entity_t *ent, const char *key ); /* VorteX: check if key exists */
const char *ValueForKey( const entity_t *ent, const char *key );
int IntForKey( const entity_t *ent, const char *key );
vec_t FloatForKey( const entity_t *ent, const char *key );
@@ -1845,6 +1879,12 @@
,
#include "game_qfusion.h" /* qfusion game */
,
+ #include "game_darkplaces.h" /* vortex: darkplaces q1 engine */
+ ,
+ #include "game_dq.h" /* vortex: deluxe quake game ( darkplaces q1 engine) */
+ ,
+ #include "game_prophecy.h" /* vortex: prophecy game ( darkplaces q1 engine) */
+ ,
{ NULL } /* null game */
};
#endif
@@ -1929,6 +1969,7 @@
Q_EXTERN char outbase[ 32 ];
Q_EXTERN int sampleSize; /* lightmap sample size in units */
+Q_EXTERN int sampleScale; /* vortex: lightmap sample scale (ie quality)*/
Q_EXTERN int mapEntityNum Q_ASSIGN( 0 );
@@ -2053,6 +2094,7 @@
Q_EXTERN qboolean wolfLight Q_ASSIGN( qfalse );
Q_EXTERN qboolean loMem Q_ASSIGN( qfalse );
Q_EXTERN qboolean noStyles Q_ASSIGN( qfalse );
+Q_EXTERN qboolean keepLights Q_ASSIGN( qfalse );
Q_EXTERN int sampleSize Q_ASSIGN( DEFAULT_LIGHTMAP_SAMPLE_SIZE );
Q_EXTERN qboolean noVertexLighting Q_ASSIGN( qfalse );
@@ -2065,6 +2107,7 @@
Q_EXTERN qboolean deluxemap Q_ASSIGN( qfalse );
Q_EXTERN qboolean debugDeluxemap Q_ASSIGN( qfalse );
+Q_EXTERN int deluxemode Q_ASSIGN( 0 ); /* deluxemap format (0 - modelspace, 1 - tangentspace with renormalization, 2 - tangentspace without renormalization) */
Q_EXTERN qboolean fast Q_ASSIGN( qfalse );
Q_EXTERN qboolean faster Q_ASSIGN( qfalse );
@@ -2098,6 +2141,14 @@
Q_EXTERN float dirtScale Q_ASSIGN( 1.0f );
Q_EXTERN float dirtGain Q_ASSIGN( 1.0f );
+/* 27: floodlighting */
+Q_EXTERN qboolean debugnormals Q_ASSIGN( qfalse );
+Q_EXTERN qboolean floodlighty Q_ASSIGN( qfalse );
+Q_EXTERN qboolean floodlight_lowquality Q_ASSIGN( qfalse );
+Q_EXTERN vec3_t floodlightRGB;
+Q_EXTERN float floodlightIntensity Q_ASSIGN( 512.0f );
+Q_EXTERN float floodlightDistance Q_ASSIGN( 1024.0f );
+
Q_EXTERN qboolean dump Q_ASSIGN( qfalse );
Q_EXTERN qboolean debug Q_ASSIGN( qfalse );
Q_EXTERN qboolean debugUnused Q_ASSIGN( qfalse );
@@ -2115,9 +2166,14 @@
Q_EXTERN float skyScale Q_ASSIGN( 1.0f );
Q_EXTERN float bounceScale Q_ASSIGN( 0.25f );
+/* vortex: gridscale and gridambientscale */
+Q_EXTERN float gridScale Q_ASSIGN( 1.0f );
+Q_EXTERN float gridAmbientScale Q_ASSIGN( 1.0f );
+
/* ydnar: lightmap gamma/compensation */
Q_EXTERN float lightmapGamma Q_ASSIGN( 1.0f );
Q_EXTERN float lightmapCompensate Q_ASSIGN( 1.0f );
+Q_EXTERN float lightmapExposure Q_ASSIGN( 1.0f );
/* ydnar: for runtime tweaking of falloff tolerance */
Q_EXTERN float falloffTolerance Q_ASSIGN( 1.0f );
@@ -2221,6 +2277,9 @@
Q_EXTERN int numExtLightmaps Q_ASSIGN( 0 );
Q_EXTERN outLightmap_t *outLightmaps Q_ASSIGN( NULL );
+/* vortex: per surface floodlight statictics */
+Q_EXTERN int numSurfacesFloodlighten Q_ASSIGN( 0 );
+
/* grid points */
Q_EXTERN int numRawGridPoints Q_ASSIGN( 0 );
Q_EXTERN rawGridPoint_t *rawGridPoints Q_ASSIGN( NULL );
Index: shaders.c
===================================================================
--- shaders.c (revision 158)
+++ shaders.c (working copy)
@@ -793,8 +793,14 @@
}
if( VectorLength( si->color ) <= 0.0f )
+ {
ColorNormalize( color, si->color );
- VectorScale( color, (1.0f / count), si->averageColor );
+ VectorScale( color, (1.0f / count), si->averageColor );
+ }
+ else
+ {
+ VectorCopy( si->color, si->averageColor );
+ }
}
@@ -804,13 +810,15 @@
finds a shaderinfo for a named shader
*/
+#define MAX_SHADER_DEPRECATION_DEPTH 16
+
shaderInfo_t *ShaderInfoForShader( const char *shaderName )
{
int i;
+ int deprecationDepth;
shaderInfo_t *si;
char shader[ MAX_QPATH ];
-
-
+
/* dummy check */
if( shaderName == NULL || shaderName[ 0 ] == '\0' )
{
@@ -823,11 +831,27 @@
StripExtension( shader );
/* search for it */
+ deprecationDepth = 0;
for( i = 0; i < numShaderInfo; i++ )
{
si = &shaderInfo[ i ];
if( !Q_stricmp( shader, si->shader ) )
{
+ /* check if shader is deprecated */
+ if (deprecationDepth < MAX_SHADER_DEPRECATION_DEPTH && si->deprecateShader && si->deprecateShader[ 0 ] )
+ {
+ /* override name */
+ strcpy( shader, si->deprecateShader );
+ StripExtension( shader );
+ /* increase deprecation depth */
+ deprecationDepth++;
+ if (deprecationDepth == MAX_SHADER_DEPRECATION_DEPTH)
+ Sys_Printf("WARNING: Max deprecation depth of %i is reached on shader '%s'\n", MAX_SHADER_DEPRECATION_DEPTH, shader);
+ /* search again from beginning */
+ i = -1;
+ continue;
+ }
+
/* load image if necessary */
if( si->finished == qfalse )
{
@@ -1340,7 +1364,6 @@
{
surfaceModel_t *model;
-
/* allocate new model and attach it */
model = safe_malloc( sizeof( *model ) );
memset( model, 0, sizeof( *model ) );
@@ -1465,6 +1488,24 @@
GetTokenAppend( shaderText, qfalse );
si->backsplashDistance = atof( token );
}
+
+ /* q3map_floodLight <r> <g> <b> <diste> <intensity> <light_direction_power> */
+ else if( !Q_stricmp( token, "q3map_floodLight" ) )
+ {
+ /* get color */
+ GetTokenAppend( shaderText, qfalse );
+ si->floodlightRGB[ 0 ] = atof( token );
+ GetTokenAppend( shaderText, qfalse );
+ si->floodlightRGB[ 1 ] = atof( token );
+ GetTokenAppend( shaderText, qfalse );
+ si->floodlightRGB[ 2 ] = atof( token );
+ GetTokenAppend( shaderText, qfalse );
+ si->floodlightDistance = atof( token );
+ GetTokenAppend( shaderText, qfalse );
+ si->floodlightIntensity = atof( token );
+ GetTokenAppend( shaderText, qfalse );
+ si->floodlightDirectionScale = atof( token );
+ }
/* q3map_lightmapSampleSize <value> */
else if( !Q_stricmp( token, "q3map_lightmapSampleSize" ) )
@@ -1590,6 +1631,18 @@
strcpy( si->remapShader, token );
}
}
+
+ /* q3map_deprecateShader <shader> */
+ else if( !Q_stricmp( token, "q3map_deprecateShader" ) )
+ {
+ GetTokenAppend( shaderText, qfalse );
+ if( token[ 0 ] != '\0' )
+ {
+
+ si->deprecateShader = safe_malloc( strlen( token ) + 1 );
+ strcpy( si->deprecateShader, token );
+ }
+ }
/* ydnar: q3map_offset <value> */
else if( !Q_stricmp( token, "q3map_offset" ) )
@@ -1896,12 +1949,14 @@
si->styleMarker = 2;
/* ydnar: default to searching for q3map_<surfaceparm> */
- else
+#if 0
+ else
{
- //% Sys_FPrintf( SYS_VRB, "Attempting to match %s with a known surfaceparm\n", token );
+ Sys_FPrintf( SYS_VRB, "Attempting to match %s with a known surfaceparm\n", token );
if( ApplySurfaceParm( &token[ 6 ], &si->contentFlags, &si->surfaceFlags, &si->compileFlags ) == qfalse )
- ;//% Sys_Printf( "WARNING: Unknown q3map_* directive \"%s\"\n", token );
+ Sys_Printf( "WARNING: Unknown q3map_* directive \"%s\"\n", token );
}
+#endif
}
Index: surface.c
===================================================================
--- surface.c (revision 158)
+++ surface.c (working copy)
@@ -304,7 +304,7 @@
out = &mapDrawSurfs[ i ];
/* walk the surface list again until a proper surface is found */
- for( j; j < numMapDrawSurfs; j++ )
+ for( ; j < numMapDrawSurfs; j++ )
{
/* get in surface */
in = &mapDrawSurfs[ j ];
@@ -484,7 +484,7 @@
/* walk the list of surfaces */
- for( numSurfs; numSurfs > 0; numSurfs--, ds++ )
+ for( ; numSurfs > 0; numSurfs--, ds++ )
{
/* ignore bogus (or flare) surfaces */
if( ds->type == SURFACE_BAD || ds->numVerts <= 0 )
@@ -2445,25 +2445,27 @@
numSurfacesByType[ ds->type ]++;
}
-
-
/*
EmitPatchSurface()
emits a bsp patch drawsurface
*/
-void EmitPatchSurface( mapDrawSurface_t *ds )
+void EmitPatchSurface( entity_t *e, mapDrawSurface_t *ds )
{
int i, j;
bspDrawSurface_t *out;
int surfaceFlags, contentFlags;
+ int forcePatchMeta;
+
+ /* vortex: _patchMeta support */
+ forcePatchMeta = IntForKey(e, "_patchMeta" );
+ if (!forcePatchMeta)
+ forcePatchMeta = IntForKey(e, "patchMeta" );
-
/* invert the surface if necessary */
if( ds->backSide || ds->shaderInfo->invert )
{
bspDrawVert_t *dv1, *dv2, temp;
-
/* walk the verts, flip the normal */
for( i = 0; i < ds->numVerts; i++ )
@@ -2485,7 +2487,7 @@
/* invert facing */
VectorScale( ds->lightmapVecs[ 2 ], -1.0f, ds->lightmapVecs[ 2 ] );
}
-
+
/* allocate a new surface */
if( numBSPDrawSurfaces == MAX_MAP_DRAW_SURFS )
Error( "MAX_MAP_DRAW_SURFS" );
@@ -2493,12 +2495,12 @@
ds->outputNum = numBSPDrawSurfaces;
numBSPDrawSurfaces++;
memset( out, 0, sizeof( *out ) );
-
+
/* set it up */
out->surfaceType = MST_PATCH;
if( debugSurfaces )
out->shaderNum = EmitShader( "debugsurfaces", NULL, NULL );
- else if( patchMeta )
+ else if( patchMeta || forcePatchMeta )
{
/* patch meta requires that we have nodraw patches for collision */
surfaceFlags = ds->shaderInfo->surfaceFlags;
@@ -2548,8 +2550,6 @@
numSurfacesByType[ ds->type ]++;
}
-
-
/*
OptimizeTriangleSurface() - ydnar
optimizes the vertex/index data in a triangle surface
@@ -2677,8 +2677,7 @@
{
int i, temp;
bspDrawSurface_t *out;
-
-
+
/* invert the surface if necessary */
if( ds->backSide || ds->shaderInfo->invert )
{
@@ -2689,15 +2688,15 @@
ds->indexes[ i ] = ds->indexes[ i + 1 ];
ds->indexes[ i + 1 ] = temp;
}
-
+
/* walk the verts, flip the normal */
for( i = 0; i < ds->numVerts; i++ )
VectorScale( ds->verts[ i ].normal, -1.0f, ds->verts[ i ].normal );
-
+
/* invert facing */
VectorScale( ds->lightmapVecs[ 2 ], -1.0f, ds->lightmapVecs[ 2 ] );
}
-
+
/* allocate a new surface */
if( numBSPDrawSurfaces == MAX_MAP_DRAW_SURFS )
Error( "MAX_MAP_DRAW_SURFS" );
@@ -2804,15 +2803,14 @@
emits a bsp planar winding (brush face) drawsurface
*/
-static void EmitFaceSurface( mapDrawSurface_t *ds )
+static void EmitFaceSurface(mapDrawSurface_t *ds )
{
/* strip/fan finding was moved elsewhere */
StripFaceSurface( ds );
- EmitTriangleSurface( ds );
+ EmitTriangleSurface(ds);
}
-
/*
MakeDebugPortalSurfs_r() - ydnar
generates drawsurfaces for passable portals in the bsp
@@ -3502,7 +3500,7 @@
if( refs == 0 )
refs = FilterPatchIntoTree( ds, tree );
if( refs > 0 )
- EmitPatchSurface( ds );
+ EmitPatchSurface( e, ds );
break;
/* handle triangle surfaces */
Index: surface_meta.c
===================================================================
--- surface_meta.c (revision 158)
+++ surface_meta.c (working copy)
@@ -312,23 +312,41 @@
creates triangles from a patch
*/
-void TriangulatePatchSurface( mapDrawSurface_t *ds )
+void TriangulatePatchSurface( entity_t *e , mapDrawSurface_t *ds )
{
int iterations, x, y, pw[ 5 ], r;
mapDrawSurface_t *dsNew;
mesh_t src, *subdivided, *mesh;
-
-
+ int forcePatchMeta;
+ int patchQuality;
+ int patchSubdivision;
+
+ /* vortex: _patchMeta, _patchQuality, _patchSubdivide support */
+ forcePatchMeta = IntForKey(e, "_patchMeta" );
+ if (!forcePatchMeta)
+ forcePatchMeta = IntForKey(e, "patchMeta" );
+ patchQuality = IntForKey(e, "_patchQuality" );
+ if (!patchQuality)
+ patchQuality = IntForKey(e, "patchQuality" );
+ if (!patchQuality)
+ patchQuality = 1.0;
+ patchSubdivision = IntForKey(e, "_patchSubdivide" );
+ if (!patchSubdivision)
+ patchSubdivision = IntForKey(e, "patchSubdivide" );
+
/* try to early out */
- if( ds->numVerts == 0 || ds->type != SURFACE_PATCH || patchMeta == qfalse )
+ if(ds->numVerts == 0 || ds->type != SURFACE_PATCH || ( patchMeta == qfalse && !forcePatchMeta) )
return;
-
/* make a mesh from the drawsurf */
src.width = ds->patchWidth;
src.height = ds->patchHeight;
src.verts = ds->verts;
//% subdivided = SubdivideMesh( src, 8, 999 );
- iterations = IterationsForCurve( ds->longestCurve, patchSubdivisions );
+ if (patchSubdivision)
+ iterations = IterationsForCurve( ds->longestCurve, patchSubdivision );
+ else
+ iterations = IterationsForCurve( ds->longestCurve, patchSubdivisions / patchQuality );
+
subdivided = SubdivideMesh2( src, iterations ); //% ds->maxIterations
/* fit it to the curve and remove colinear verts on rows/columns */
@@ -652,12 +685,12 @@
break;
case SURFACE_PATCH:
- TriangulatePatchSurface( ds );
+ TriangulatePatchSurface(e, ds );
break;
case SURFACE_TRIANGLES:
break;
-
+
case SURFACE_FORCED_META:
case SURFACE_META:
SurfaceToMetaTriangles( ds );
@@ -972,8 +1005,8 @@
vec3_t average, diff;
int indexes[ MAX_SAMPLES ];
vec3_t votes[ MAX_SAMPLES ];
+ const char *classname;
-
/* note it */
Sys_FPrintf( SYS_VRB, "--- SmoothMetaTriangles ---\n" );
@@ -994,11 +1027,31 @@
and set per-vertex smoothing angle */
for( i = 0, tri = &metaTriangles[ i ]; i < numMetaTriangles; i++, tri++ )
{
+ /* vortex: try get smoothing from entity key */
+ shadeAngle = FloatForKey(&entities[tri->entityNum], "_smoothnormals");
+ if (shadeAngle <= 0.0f)
+ shadeAngle = FloatForKey(&entities[tri->entityNum], "_sn");
+ if (shadeAngle <= 0.0f)
+ shadeAngle = FloatForKey(&entities[tri->entityNum], "_smooth");
+ if (shadeAngle > 0.0f)
+ {
+ if (entities[tri->entityNum].forceNormalSmoothing == qfalse)
+ {
+ entities[tri->entityNum].forceNormalSmoothing = qtrue;
+ classname = ValueForKey( &entities[tri->entityNum], "classname" );
+ Sys_Printf( "Entity %d (%s) has vertex normal smoothing with breaking angle of %3.0f\n", tri->entityNum, classname, shadeAngle );
+ }
+ shadeAngle = DEG2RAD( shadeAngle );
+ }
+
/* get shader for shade angle */
- if( tri->si->shadeAngleDegrees > 0.0f )
- shadeAngle = DEG2RAD( tri->si->shadeAngleDegrees );
- else
- shadeAngle = defaultShadeAngle;
+ if (shadeAngle <= 0.0f)
+ {
+ if( tri->si->shadeAngleDegrees > 0.0f )
+ shadeAngle = DEG2RAD( tri->si->shadeAngleDegrees );
+ else
+ shadeAngle = defaultShadeAngle;
+ }
if( shadeAngle > maxShadeAngle )
maxShadeAngle = shadeAngle;
Index: writebsp.c
===================================================================
--- writebsp.c (revision 158)
+++ writebsp.c (working copy)
@@ -136,7 +136,6 @@
bspLeaf_t *leaf_p;
brush_t *b;
drawSurfRef_t *dsr;
- int i = 0;
/* check limits */
@@ -278,18 +277,19 @@
void SetLightStyles( void )
{
int i, j, style, numStyles;
- qboolean keepLights;
const char *t;
entity_t *e;
epair_t *ep, *next;
char value[ 10 ];
char lightTargets[ MAX_SWITCHED_LIGHTS ][ 64 ];
int lightStyles[ MAX_SWITCHED_LIGHTS ];
-
-
+
/* ydnar: determine if we keep lights in the bsp */
- t = ValueForKey( &entities[ 0 ], "_keepLights" );
- keepLights = (t[ 0 ] == '1') ? qtrue : qfalse;
+ if (KeyExists(&entities[ 0 ], "_keepLights") == qtrue)
+ {
+ t = ValueForKey( &entities[ 0 ], "_keepLights" );
+ keepLights = (t[ 0 ] == '1') ? qtrue : qfalse;
+ }
/* any light that is controlled (has a targetname) must have a unique style number generated for it */
numStyles = 0;