@@ -73,8 +73,14 @@ void CG_KiTrail( int entityNum, vec3_t origin, qboolean remove, qhandle_t hShade
7373 int kiTrailLength = cg_kiTrail .integer ;
7474 trail_t * kiTrail = & cg_trails [entityNum ][KI_TRAIL ];
7575 const int MONSTER_TRAIL_WIDTH = 150 ;
76-
77- if ( entityNum < 0 || entityNum >= MAX_GENTITIES ) {
76+ const int OVERLAP_TIMES = 3 ;
77+ float kiTrailWidth = // for the player monster
78+ ( cg_entities [entityNum ].currentState .eFlags & EF_MONSTER )
79+ ? MONSTER_TRAIL_WIDTH
80+ : 15 ;
81+
82+ if ( entityNum < 0 || entityNum >= MAX_GENTITIES
83+ || kiTrailLength < 4 ) { // don't draw if ki trail length is less than 4
7884 return ;
7985 }
8086
@@ -100,17 +106,14 @@ void CG_KiTrail( int entityNum, vec3_t origin, qboolean remove, qhandle_t hShade
100106 // add the current position at the start
101107 VectorCopy ( origin , kiTrail -> segments [0 ] );
102108
103- for ( i = 0 ; i < kiTrail -> numSegments - 1 ; ++ i ) {
109+ for ( i = 0 ; i < kiTrail -> numSegments - OVERLAP_TIMES ; ++ i ) {
104110 vec3_t start , end ;
105111
106112 VectorCopy ( kiTrail -> segments [i ], start );
107- if ( i > 0 ) {
108- VectorCopy ( kiTrail -> segments [i - 1 ], start );
109- }
110- VectorCopy ( kiTrail -> segments [i + 1 ], end );
113+ VectorCopy ( kiTrail -> segments [i + OVERLAP_TIMES ], end );
111114
112- // for the player monster
113- if ( cg_entities [ entityNum ]. currentState . eFlags & EF_MONSTER ) {
115+ // render the polys
116+ {
114117 polyVert_t verts [4 ];
115118 vec3_t forward , right ;
116119 vec3_t viewAxis ;
@@ -122,26 +125,28 @@ void CG_KiTrail( int entityNum, vec3_t origin, qboolean remove, qhandle_t hShade
122125 CrossProduct ( viewAxis , forward , right );
123126 VectorNormalize ( right );
124127
125- VectorMA ( end , MONSTER_TRAIL_WIDTH , right , verts [0 ].xyz );
126- VectorArray2Set ( verts [0 ].st , 0 , 1 );
128+ VectorMA ( start , kiTrailWidth , right , verts [0 ].xyz );
129+ VectorArray2Set ( verts [0 ].st , 0 , 0 );
127130 Vector4Set ( verts [0 ].modulate , 255 , 255 , 255 , 255 );
128131
129- VectorMA ( end , - MONSTER_TRAIL_WIDTH , right , verts [1 ].xyz );
132+ VectorMA ( end , kiTrailWidth , right , verts [1 ].xyz );
130133 VectorArray2Set ( verts [1 ].st , 1 , 0 );
131134 Vector4Set ( verts [1 ].modulate , 255 , 255 , 255 , 255 );
132135
133- VectorMA ( start , - MONSTER_TRAIL_WIDTH , right , verts [2 ].xyz );
134- VectorArray2Set ( verts [2 ].st , 1 , 0 );
136+ VectorMA ( end , - kiTrailWidth , right , verts [2 ].xyz );
137+ VectorArray2Set ( verts [2 ].st , 1 , 1 );
135138 Vector4Set ( verts [2 ].modulate , 255 , 255 , 255 , 255 );
136139
137- VectorMA ( start , MONSTER_TRAIL_WIDTH , right , verts [3 ].xyz );
140+ VectorMA ( start , - kiTrailWidth , right , verts [3 ].xyz );
138141 VectorArray2Set ( verts [3 ].st , 0 , 1 );
139142 Vector4Set ( verts [3 ].modulate , 255 , 255 , 255 , 255 );
140143
141- // render 2 times for better visual effect
142- trap_R_AddPolyToScene ( hShader , 4 , verts );
143144 trap_R_AddPolyToScene ( hShader , 4 , verts );
144- } else { // I see... so, BFP originally used RT_RAIL_CORE, they didn't care the size, it was already set
145+ }
146+
147+ // disabled, sample code
148+ #if 0
149+ { // I see... so, BFP originally used RT_RAIL_CORE, they didn't care the size, it was already set
145150 refEntity_t beam ;
146151 memset ( & beam , 0 , sizeof ( beam ) );
147152 beam .reType = RT_RAIL_CORE ;
@@ -150,10 +155,9 @@ void CG_KiTrail( int entityNum, vec3_t origin, qboolean remove, qhandle_t hShade
150155 VectorCopy ( end , beam .oldorigin );
151156 beam .shaderRGBA [0 ] = beam .shaderRGBA [1 ] = beam .shaderRGBA [2 ] = beam .shaderRGBA [3 ] = 255 ;
152157
153- // render 2 times for better visual effect
154- trap_R_AddRefEntityToScene ( & beam );
155158 trap_R_AddRefEntityToScene ( & beam );
156159 }
160+ #endif
157161 }
158162}
159163
0 commit comments