]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - tools/quake3/q3map2/map.c
fix two msvc compile errors
[xonotic/netradiant.git] / tools / quake3 / q3map2 / map.c
index 78c772931d3caf785b5a82b1cc79052f44b121d3..9b7ba71a55c1f33a472b122302f38d6eefb9fc73 100644 (file)
@@ -44,7 +44,7 @@ several games based on the Quake III Arena engine, in the form of "Q3Map2."
 #define        USE_HASHING
 #define        PLANE_HASHES    8192
 
-plane_t                                        *planehash[ PLANE_HASHES ];
+int                                            planehash[ PLANE_HASHES ];
 
 int                                            c_boxbevels;
 int                                            c_edgebevels;
@@ -96,7 +96,7 @@ void AddPlaneToHash( plane_t *p )
        hash = (PLANE_HASHES - 1) & (int) fabs( p->dist );
 
        p->hash_chain = planehash[hash];
-       planehash[hash] = p;
+       planehash[hash] = p - mapplanes + 1;
 }
 
 /*
@@ -115,8 +115,7 @@ int CreateNewFloatPlane (vec3_t normal, vec_t dist)
        }
 
        // create a new plane
-       if (nummapplanes+2 > MAX_MAP_PLANES)
-               Error ("MAX_MAP_PLANES");
+       AUTOEXPAND_BY_REALLOC(mapplanes, nummapplanes+1, allocatedmapplanes, 1024);
 
        p = &mapplanes[nummapplanes];
        VectorCopy (normal, p->normal);
@@ -219,6 +218,7 @@ int FindFloatPlane( vec3_t normal, vec_t dist, int numPoints, vec3_t *points ) /
 
 {
        int             i, j, hash, h;
+       int pidx;
        plane_t *p;
        vec_t   d;
        vec3_t centerofweight;
@@ -235,8 +235,10 @@ int FindFloatPlane( vec3_t normal, vec_t dist, int numPoints, vec3_t *points ) /
        for( i = -1; i <= 1; i++ )
        {
                h = (hash + i) & (PLANE_HASHES - 1);
-               for( p = planehash[ h ]; p != NULL; p = p->hash_chain )
+               for( pidx = planehash[ h ] - 1; pidx != -1; pidx = mapplanes[pidx].hash_chain - 1 )
                {
+                       p = &mapplanes[pidx];
+
                        /* do standard plane compare */
                        if( !PlaneEqual( p, normal, dist ) )
                                continue;
@@ -595,6 +597,22 @@ produces a final brush based on the buildBrush->sides array
 and links it to the current entity
 */
 
+static void MergeOrigin(entity_t *ent, vec3_t origin)
+{
+       vec3_t adjustment;
+       char string[128];
+
+       /* we have not parsed the brush completely yet... */
+       GetVectorForKey( ent, "origin", ent->origin );
+
+       VectorMA(origin, -1, ent->originbrush_origin, adjustment);
+       VectorAdd(adjustment, ent->origin, ent->origin);
+       VectorCopy(origin, ent->originbrush_origin);
+
+       sprintf(string, "%f %f %f", ent->origin[0], ent->origin[1], ent->origin[2]);
+       SetKeyValue(ent, "origin", string);
+}
+
 brush_t *FinishBrush( void )
 {
        brush_t         *b;
@@ -611,6 +629,9 @@ brush_t *FinishBrush( void )
                char    string[ 32 ];
                vec3_t  origin;
 
+               Sys_Printf( "Entity %i, Brush %i: origin brush detected\n", 
+                               mapEnt->mapEntityNum, entitySourceBrushes );
+
                if( numEntities == 1 )
                {
                        Sys_Printf( "Entity %i, Brush %i: origin brushes not allowed in world\n", 
@@ -621,10 +642,7 @@ brush_t *FinishBrush( void )
                VectorAdd (buildBrush->mins, buildBrush->maxs, origin);
                VectorScale (origin, 0.5, origin);
 
-               sprintf( string, "%i %i %i", (int) origin[ 0 ], (int) origin[ 1 ], (int) origin[ 2 ] );
-               SetKeyValue( &entities[ numEntities - 1 ], "origin", string);
-
-               VectorCopy( origin, entities[ numEntities - 1 ].origin);
+               MergeOrigin(&entities[ numEntities - 1 ], origin);
 
                /* don't keep this brush */
                return NULL;
@@ -1069,11 +1087,16 @@ adds them to the world's brush list
 (used by func_group)
 */
 
+void AdjustBrushesForOrigin( entity_t *ent );
 void MoveBrushesToWorld( entity_t *ent )
 {
        brush_t         *b, *next;
        parseMesh_t     *pm;
 
+       /* we need to undo the common/origin adjustment, and instead shift them by the entity key origin */
+       VectorScale(ent->origin, -1, ent->originbrush_origin);
+       AdjustBrushesForOrigin(ent);
+       VectorClear(ent->originbrush_origin);
        
        /* move brushes */
        for( b = ent->brushes; b != NULL; b = next )
@@ -1136,7 +1159,6 @@ void AdjustBrushesForOrigin( entity_t *ent )
        brush_t         *b;
        parseMesh_t     *p;
        
-       
        /* walk brush list */
        for( b = ent->brushes; b != NULL; b = b->next )
        {
@@ -1147,7 +1169,7 @@ void AdjustBrushesForOrigin( entity_t *ent )
                        s = &b->sides[ i ];
                        
                        /* offset side plane */
-                       newdist = mapplanes[ s->planenum ].dist - DotProduct( mapplanes[ s->planenum ].normal, ent->origin );
+                       newdist = mapplanes[ s->planenum ].dist - DotProduct( mapplanes[ s->planenum ].normal, ent->originbrush_origin );
                        
                        /* find a new plane */
                        s->planenum = FindFloatPlane( mapplanes[ s->planenum ].normal, newdist, 0, NULL );
@@ -1161,7 +1183,7 @@ void AdjustBrushesForOrigin( entity_t *ent )
        for( p = ent->patches; p != NULL; p = p->next )
        {
                for( i = 0; i < (p->mesh.width * p->mesh.height); i++ )
-                       VectorSubtract( p->mesh.verts[ i ].xyz, ent->origin, p->mesh.verts[ i ].xyz );
+                       VectorSubtract( p->mesh.verts[ i ].xyz, ent->originbrush_origin, p->mesh.verts[ i ].xyz );
        }
 }
 
@@ -1531,14 +1553,18 @@ static qboolean ParseMapEntity( qboolean onlyLights )
        /* get explicit shadow flags */
        GetEntityShadowFlags( mapEnt, NULL, &castShadows, &recvShadows );
        
+       /* vortex: added _ls key (short name of lightmapscale) */
        /* ydnar: get lightmap scaling value for this entity */
        if( strcmp( "", ValueForKey( mapEnt, "lightmapscale" ) ) ||
-               strcmp( "", ValueForKey( mapEnt, "_lightmapscale" ) ) )
+               strcmp( "", ValueForKey( mapEnt, "_lightmapscale" ) ) || 
+               strcmp( "", ValueForKey( mapEnt, "_ls" ) ) )
        {
                /* get lightmap scale from entity */
                lightmapScale = FloatForKey( mapEnt, "lightmapscale" );
                if( lightmapScale <= 0.0f )
                        lightmapScale = FloatForKey( mapEnt, "_lightmapscale" );
+               if( lightmapScale <= 0.0f )
+                       lightmapScale = FloatForKey( mapEnt, "_ls" );
                if( lightmapScale > 0.0f )
                        Sys_Printf( "Entity %d (%s) has lightmap scale of %.4f\n", mapEnt->mapEntityNum, classname, lightmapScale );
        }
@@ -1556,7 +1582,7 @@ static qboolean ParseMapEntity( qboolean onlyLights )
                Sys_Printf( "Entity %d (%s) has cel shader %s\n", mapEnt->mapEntityNum, classname, celShader->shader );
        }
        else
-               celShader = NULL;
+               celShader = *globalCelShader ? ShaderInfoForShader(globalCelShader) : NULL;
        
        /* attach stuff to everything in the entity */
        for( brush = mapEnt->brushes; brush != NULL; brush = brush->next )
@@ -1585,7 +1611,7 @@ static qboolean ParseMapEntity( qboolean onlyLights )
        
        /* get entity origin and adjust brushes */
        GetVectorForKey( mapEnt, "origin", mapEnt->origin );
-       if( mapEnt->origin[ 0 ] || mapEnt->origin[ 1 ] || mapEnt->origin[ 2 ] )
+       if( mapEnt->originbrush_origin[ 0 ] || mapEnt->originbrush_origin[ 1 ] || mapEnt->originbrush_origin[ 2 ] )
                AdjustBrushesForOrigin( mapEnt );
 
        /* group_info entities are just for editor grouping (fixme: leak!) */