summaryrefslogtreecommitdiff
path: root/src/cgame/cg_marks.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/cgame/cg_marks.c')
-rw-r--r--src/cgame/cg_marks.c280
1 files changed, 0 insertions, 280 deletions
diff --git a/src/cgame/cg_marks.c b/src/cgame/cg_marks.c
deleted file mode 100644
index cc8979de..00000000
--- a/src/cgame/cg_marks.c
+++ /dev/null
@@ -1,280 +0,0 @@
-// Copyright (C) 1999-2000 Id Software, Inc.
-//
-// cg_marks.c -- wall marks
-
-/*
- * Portions Copyright (C) 2000-2001 Tim Angus
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the OSML - Open Source Modification License v1.0 as
- * described in the file COPYING which is distributed with this source
- * code.
- *
- * This program 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.
- */
-
-#include "cg_local.h"
-
-/*
-===================================================================
-
-MARK POLYS
-
-===================================================================
-*/
-
-
-markPoly_t cg_activeMarkPolys; // double linked list
-markPoly_t *cg_freeMarkPolys; // single linked list
-markPoly_t cg_markPolys[ MAX_MARK_POLYS ];
-static int markTotal;
-
-/*
-===================
-CG_InitMarkPolys
-
-This is called at startup and for tournement restarts
-===================
-*/
-void CG_InitMarkPolys( void )
-{
- int i;
-
- memset( cg_markPolys, 0, sizeof( cg_markPolys ) );
-
- cg_activeMarkPolys.nextMark = &cg_activeMarkPolys;
- cg_activeMarkPolys.prevMark = &cg_activeMarkPolys;
- cg_freeMarkPolys = cg_markPolys;
-
- for( i = 0; i < MAX_MARK_POLYS - 1; i++ )
- cg_markPolys[ i ].nextMark = &cg_markPolys[ i + 1 ];
-}
-
-
-/*
-==================
-CG_FreeMarkPoly
-==================
-*/
-void CG_FreeMarkPoly( markPoly_t *le )
-{
- if( !le->prevMark )
- CG_Error( "CG_FreeLocalEntity: not active" );
-
- // remove from the doubly linked active list
- le->prevMark->nextMark = le->nextMark;
- le->nextMark->prevMark = le->prevMark;
-
- // the free list is only singly linked
- le->nextMark = cg_freeMarkPolys;
- cg_freeMarkPolys = le;
-}
-
-/*
-===================
-CG_AllocMark
-
-Will allways succeed, even if it requires freeing an old active mark
-===================
-*/
-markPoly_t *CG_AllocMark( void )
-{
- markPoly_t *le;
- int time;
-
- if( !cg_freeMarkPolys )
- {
- // no free entities, so free the one at the end of the chain
- // remove the oldest active entity
- time = cg_activeMarkPolys.prevMark->time;
-
- while( cg_activeMarkPolys.prevMark && time == cg_activeMarkPolys.prevMark->time )
- CG_FreeMarkPoly( cg_activeMarkPolys.prevMark );
- }
-
- le = cg_freeMarkPolys;
- cg_freeMarkPolys = cg_freeMarkPolys->nextMark;
-
- memset( le, 0, sizeof( *le ) );
-
- // link into the active list
- le->nextMark = cg_activeMarkPolys.nextMark;
- le->prevMark = &cg_activeMarkPolys;
- cg_activeMarkPolys.nextMark->prevMark = le;
- cg_activeMarkPolys.nextMark = le;
- return le;
-}
-
-
-
-/*
-=================
-CG_ImpactMark
-
-origin should be a point within a unit of the plane
-dir should be the plane normal
-
-temporary marks will not be stored or randomly oriented, but immediately
-passed to the renderer.
-=================
-*/
-#define MAX_MARK_FRAGMENTS 128
-#define MAX_MARK_POINTS 384
-
-void CG_ImpactMark( qhandle_t markShader, const vec3_t origin, const vec3_t dir,
- float orientation, float red, float green, float blue, float alpha,
- qboolean alphaFade, float radius, qboolean temporary )
-{
- vec3_t axis[ 3 ];
- float texCoordScale;
- vec3_t originalPoints[ 4 ];
- byte colors[ 4 ];
- int i, j;
- int numFragments;
- markFragment_t markFragments[ MAX_MARK_FRAGMENTS ], *mf;
- vec3_t markPoints[ MAX_MARK_POINTS ];
- vec3_t projection;
-
- if( !cg_addMarks.integer )
- return;
-
- if( radius <= 0 )
- CG_Error( "CG_ImpactMark called with <= 0 radius" );
-
- //if ( markTotal >= MAX_MARK_POLYS ) {
- // return;
- //}
-
- // create the texture axis
- VectorNormalize2( dir, axis[ 0 ] );
- PerpendicularVector( axis[ 1 ], axis[ 0 ] );
- RotatePointAroundVector( axis[ 2 ], axis[ 0 ], axis[ 1 ], orientation );
- CrossProduct( axis[ 0 ], axis[ 2 ], axis[ 1 ] );
-
- texCoordScale = 0.5 * 1.0 / radius;
-
- // create the full polygon
- for( i = 0; i < 3; i++ )
- {
- originalPoints[ 0 ][ i ] = origin[ i ] - radius * axis[ 1 ][ i ] - radius * axis[ 2 ][ i ];
- originalPoints[ 1 ][ i ] = origin[ i ] + radius * axis[ 1 ][ i ] - radius * axis[ 2 ][ i ];
- originalPoints[ 2 ][ i ] = origin[ i ] + radius * axis[ 1 ][ i ] + radius * axis[ 2 ][ i ];
- originalPoints[ 3 ][ i ] = origin[ i ] - radius * axis[ 1 ][ i ] + radius * axis[ 2 ][ i ];
- }
-
- // get the fragments
- VectorScale( dir, -20, projection );
- numFragments = trap_CM_MarkFragments( 4, (void *)originalPoints,
- projection, MAX_MARK_POINTS, markPoints[ 0 ],
- MAX_MARK_FRAGMENTS, markFragments );
-
- colors[ 0 ] = red * 255;
- colors[ 1 ] = green * 255;
- colors[ 2 ] = blue * 255;
- colors[ 3 ] = alpha * 255;
-
- for( i = 0, mf = markFragments; i < numFragments; i++, mf++ )
- {
- polyVert_t *v;
- polyVert_t verts[ MAX_VERTS_ON_POLY ];
- markPoly_t *mark;
-
- // we have an upper limit on the complexity of polygons
- // that we store persistantly
- if( mf->numPoints > MAX_VERTS_ON_POLY )
- mf->numPoints = MAX_VERTS_ON_POLY;
-
- for( j = 0, v = verts; j < mf->numPoints; j++, v++ )
- {
- vec3_t delta;
-
- VectorCopy( markPoints[ mf->firstPoint + j ], v->xyz );
-
- VectorSubtract( v->xyz, origin, delta );
- v->st[ 0 ] = 0.5 + DotProduct( delta, axis[ 1 ] ) * texCoordScale;
- v->st[ 1 ] = 0.5 + DotProduct( delta, axis[ 2 ] ) * texCoordScale;
- *(int *)v->modulate = *(int *)colors;
- }
-
- // if it is a temporary (shadow) mark, add it immediately and forget about it
- if( temporary )
- {
- trap_R_AddPolyToScene( markShader, mf->numPoints, verts );
- continue;
- }
-
- // otherwise save it persistantly
- mark = CG_AllocMark( );
- mark->time = cg.time;
- mark->alphaFade = alphaFade;
- mark->markShader = markShader;
- mark->poly.numVerts = mf->numPoints;
- mark->color[ 0 ] = red;
- mark->color[ 1 ] = green;
- mark->color[ 2 ] = blue;
- mark->color[ 3 ] = alpha;
- memcpy( mark->verts, verts, mf->numPoints * sizeof( verts[ 0 ] ) );
- markTotal++;
- }
-}
-
-
-/*
-===============
-CG_AddMarks
-===============
-*/
-#define MARK_TOTAL_TIME 10000
-#define MARK_FADE_TIME 1000
-
-void CG_AddMarks( void )
-{
- int j;
- markPoly_t *mp, *next;
- int t;
- int fade;
-
- if( !cg_addMarks.integer )
- return;
-
- mp = cg_activeMarkPolys.nextMark;
- for ( ; mp != &cg_activeMarkPolys; mp = next )
- {
- // grab next now, so if the local entity is freed we
- // still have it
- next = mp->nextMark;
-
- // see if it is time to completely remove it
- if( cg.time > mp->time + MARK_TOTAL_TIME )
- {
- CG_FreeMarkPoly( mp );
- continue;
- }
-
- // fade all marks out with time
- t = mp->time + MARK_TOTAL_TIME - cg.time;
- if( t < MARK_FADE_TIME )
- {
- fade = 255 * t / MARK_FADE_TIME;
- if( mp->alphaFade )
- {
- for( j = 0; j < mp->poly.numVerts; j++ )
- mp->verts[ j ].modulate[ 3 ] = fade;
- }
- else
- {
- for( j = 0; j < mp->poly.numVerts; j++ )
- {
- mp->verts[ j ].modulate[ 0 ] = mp->color[ 0 ] * fade;
- mp->verts[ j ].modulate[ 1 ] = mp->color[ 1 ] * fade;
- mp->verts[ j ].modulate[ 2 ] = mp->color[ 2 ] * fade;
- }
- }
- }
-
- trap_R_AddPolyToScene( mp->markShader, mp->poly.numVerts, mp->verts );
- }
-}
-