Esempio n. 1
0
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" );
		}
	}
}
Esempio n. 2
0
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" );
		}
	}
}
Esempio n. 3
0
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" );
		}
	}
}
Esempio n. 4
0
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;
}