void CG_CreateDecal( const vec3_c& p, const vec3_c& dir, float radius, const char* matName ) { trace_c tr; tr.setupRay( p, dir * 100000.f ); if ( CG_RayTrace( tr, -1 ) == false ) { CG_Printf( "CG_DoRailgunEffect: no hit\n" ); return; // no hit } mtrAPI_i* decalMaterial = g_ms->registerMaterial( matName ); centity_s* hit = tr.getHitCGEntity(); if ( hit == 0 || hit == &cg_entities[ENTITYNUM_WORLD] ) { CG_Printf( "CG_CreateDecal: creating world decal\n" ); rf->addWorldMapDecal( tr.getHitPos(), tr.getHitPlaneNormal(), radius, decalMaterial ); return; } else { CG_Printf( "CG_CreateDecal: creating entity decal\n" ); if ( hit->rEnt ) { hit->rEnt->addDecalWorldSpace( tr.getHitPos(), tr.getHitPlaneNormal(), radius, decalMaterial ); } else { CG_Printf( "CG_CreateDecal: hit centity has NULL rEnt\n" ); } } }
static void CG_DoRailgunEffect() { // va("doRailgunEffect railCore railDisc railExplosion gfx/damage/plasma_mrk %f %f %f %f %f %f %i",muzzle.x,muzzle.y,muzzle.z, vec3_c p, d; str coreMaterialName = CG_Argv( 1 ); str discMaterialName = CG_Argv( 2 ); str explosionMaterialName = CG_Argv( 3 ); str decalMaterialName = CG_Argv( 4 ); p.x = atof( CG_Argv( 5 ) ); p.y = atof( CG_Argv( 6 ) ); p.z = atof( CG_Argv( 7 ) ); d.x = atof( CG_Argv( 8 ) ); d.y = atof( CG_Argv( 9 ) ); d.z = atof( CG_Argv( 10 ) ); int skipEntityNum = atoi( CG_Argv( 11 ) ); CG_Printf( "CG_DoRailgunEffect: from %f %f %f, dir %f %f %f\n", p.x, p.y, p.z, d.x, d.y, d.z ); trace_c tr; tr.setupRay( p, d * 100000.f ); if ( CG_RayTrace( tr, skipEntityNum ) == false ) { CG_Printf( "CG_DoRailgunEffect: no hit\n" ); return; // no hit } mtrAPI_i* coreMaterial = g_ms->registerMaterial( coreMaterialName ); mtrAPI_i* diskMaterial = g_ms->registerMaterial( discMaterialName ); CG_AddBulletTracer( tr.getStartPos() - vec3_c( 0, 0, 12 ), tr.getHitPos(), 32.f, coreMaterial, 1000 ); mtrAPI_i* decalMaterial = g_ms->registerMaterial( decalMaterialName ); float radius = 32.f; centity_s* hit = tr.getHitCGEntity(); if ( hit == 0 || hit == &cg_entities[ENTITYNUM_WORLD] ) { CG_Printf( "CG_DoRailgunEffect: hit Worldspawn\n" ); if ( cg_debugDrawBulletAttack.getInt() ) { rf->addDebugLine( tr.getHitPos(), tr.getHitPos() + radius * tr.getHitPlaneNormal(), vec3_c( 1, 0, 0 ), 5.f ); } rf->addWorldMapDecal( tr.getHitPos(), tr.getHitPlaneNormal(), radius, decalMaterial ); } else { CG_Printf( "CG_DoRailgunEffect: hit entity\n" ); if ( hit->rEnt ) { hit->rEnt->addDecalWorldSpace( tr.getHitPos(), tr.getHitPlaneNormal(), radius, decalMaterial ); } else { CG_Printf( "CG_DoRailgunEffect: hit centity has NULL rEnt\n" ); } } }
static void CG_TestBulletAttack() { vec3_c p, d; str decalMaterialName = CG_Argv( 1 ); p.x = atof( CG_Argv( 2 ) ); p.y = atof( CG_Argv( 3 ) ); p.z = atof( CG_Argv( 4 ) ); d.x = atof( CG_Argv( 5 ) ); d.y = atof( CG_Argv( 6 ) ); d.z = atof( CG_Argv( 7 ) ); int skipEntityNum = atoi( CG_Argv( 8 ) ); CG_Printf( "CG_TestBulletAttack: from %f %f %f, dir %f %f %f\n", p.x, p.y, p.z, d.x, d.y, d.z ); trace_c tr; tr.setupRay( p, d * 100000.f ); if ( CG_RayTrace( tr, skipEntityNum ) == false ) { CG_Printf( "CG_TestBulletAttack: no hit\n" ); return; // no hit } //mtrAPI_i *decalMaterial = g_ms->registerMaterial("qiotests/testdecalmaterial"); mtrAPI_i* decalMaterial = g_ms->registerMaterial( decalMaterialName ); float radius = 8.f; centity_s* hit = tr.getHitCGEntity(); if ( hit == &cg_entities[ENTITYNUM_WORLD] ) { CG_Printf( "CG_TestBulletAttack: hit Worldspawn\n" ); if ( cg_debugDrawBulletAttack.getInt() ) { rf->addDebugLine( tr.getHitPos(), tr.getHitPos() + radius * tr.getHitPlaneNormal(), vec3_c( 1, 0, 0 ), 5.f ); } rf->addWorldMapDecal( tr.getHitPos(), tr.getHitPlaneNormal(), radius, decalMaterial ); return; } else { CG_Printf( "CG_TestBulletAttack: hit entity\n" ); if ( hit->rEnt ) { hit->rEnt->addDecalWorldSpace( tr.getHitPos(), tr.getHitPlaneNormal(), radius, decalMaterial ); } else { CG_Printf( "CG_TestBulletAttack: hit centity has NULL rEnt\n" ); } } }
static void CG_OffsetThirdPersonView( void ) { vec3_c forward, right, up; vec3_c view; vec3_c focusAngles; static vec3_t mins = { -4, -4, -4 }; static vec3_t maxs = { 4, 4, 4 }; vec3_c focusPoint; float focusDist; float forwardScale, sideScale; cg.refdefViewOrigin[2] += cg.predictedPlayerState.viewheight; focusAngles = cg.refdefViewAngles; // if dead, look at killer //if ( cg.predictedPlayerState.stats[STAT_HEALTH] <= 0 ) { // focusAngles[YAW] = cg.predictedPlayerState.stats[STAT_DEAD_YAW]; // cg.refdefViewAngles[YAW] = cg.predictedPlayerState.stats[STAT_DEAD_YAW]; //} if ( focusAngles[PITCH] > 45 ) { focusAngles[PITCH] = 45; // don't go too far overhead } forward = focusAngles.getForward(); focusPoint.vectorMA( cg.refdefViewOrigin, forward, FOCUS_DISTANCE ); view = cg.refdefViewOrigin; view[2] += 8; cg.refdefViewAngles[PITCH] *= 0.5; cg.refdefViewAngles.angleVectors( forward, right, up ); float thirdPersonRange = 128.f; forwardScale = cos( cg_thirdPersonAngle.value / 180 * M_PI ); sideScale = sin( cg_thirdPersonAngle.value / 180 * M_PI ); view.vectorMA( view, forward, -thirdPersonRange * forwardScale ); view.vectorMA( view, right, -thirdPersonRange * sideScale ); // trace a ray from the origin to the viewpoint to make sure the view isn't // in a solid block. Use an 8 by 8 block to prevent the view from near clipping anything // if (!cg_cameraMode.integer) { trace_c trace; trace.setupRay( cg.refdefViewOrigin, view ); CG_RayTrace( trace, cg.clientNum ); //CG_Trace( &trace, cg.refdefViewOrigin, mins, maxs, view, cg.predictedPlayerState.clientNum, MASK_SOLID ); if ( trace.getFraction() != 1.f ) { // VectorCopy( trace.endpos, view ); // view[2] += (1.0 - trace.fraction) * 32; // // try another trace to this position, because a tunnel may have the ceiling // // close enogh that this is poking out // CG_Trace( &trace, cg.refdefViewOrigin, mins, maxs, view, cg.predictedPlayerState.clientNum, MASK_SOLID ); // VectorCopy( trace.endpos, view ); view = trace.getHitPos(); view -= trace.getDir() * 7.f; } } cg.refdefViewOrigin = view; // select pitch to look at focus point from vieword focusPoint -= cg.refdefViewOrigin; focusDist = sqrt( focusPoint[0] * focusPoint[0] + focusPoint[1] * focusPoint[1] ); if ( focusDist < 1 ) { focusDist = 1; // should never happen } cg.refdefViewAngles[PITCH] = -180 / M_PI * atan2( focusPoint[2], focusDist ); cg.refdefViewAngles[YAW] -= cg_thirdPersonAngle.value; }