/* ============ idSecurityCamera::Killed ============ */ void idSecurityCamera::Killed( idEntity *inflictor, idEntity *attacker, int damage, const idVec3 &dir, int location ) { sweeping = false; StopSound( SND_CHANNEL_ANY, false ); // RAVEN BEGIN // bdube: replaced fx call with raven call gameLocal.PlayEffect ( spawnArgs, "fx_destroyed", GetPhysics()->GetOrigin(), GetPhysics()->GetAxis() ); /* const char *fx = spawnArgs.GetString( "fx_destroyed" ); if ( fx[0] != '\0' ) { idEntityFx::StartFx( fx, NULL, NULL, this, true ); } */ // RAVEN END physicsObj.SetSelf( this ); physicsObj.SetClipModel( new idClipModel( trm ), 0.02f ); physicsObj.SetOrigin( GetPhysics()->GetOrigin() ); physicsObj.SetAxis( GetPhysics()->GetAxis() ); physicsObj.SetBouncyness( 0.2f ); physicsObj.SetFriction( 0.6f, 0.6f, 0.2f ); physicsObj.SetGravity( gameLocal.GetGravity() ); physicsObj.SetContents( CONTENTS_SOLID ); physicsObj.SetClipMask( MASK_SOLID | CONTENTS_BODY | CONTENTS_CORPSE | CONTENTS_MOVEABLECLIP ); SetPhysics( &physicsObj ); physicsObj.DropToFloor(); }
/* ================ rvVehicleAnimated::Spawn ================ */ void rvVehicleAnimated::Spawn( void ) { turnRate = spawnArgs.GetFloat ( "turnRate", "90" ); viewAngles = GetPhysics()->GetAxis ( ).ToAngles ( ); viewAxis = viewAngles.ToMat3(); // Initialize the physics object physicsObj.SetSelf( this ); physicsObj.SetClipModel( new idClipModel( GetPhysics()->GetClipModel() ), 1.0f ); physicsObj.SetContents( CONTENTS_BODY ); physicsObj.SetClipMask( MASK_PLAYERSOLID|CONTENTS_VEHICLECLIP ); physicsObj.SetMaxStepHeight( spawnArgs.GetFloat ( "stepheight", "14" ) ); // Start just a tad above the floor physicsObj.SetOrigin( GetPhysics()->GetOrigin() + idVec3( 0, 0, CM_CLIP_EPSILON ) ); physicsObj.SetMass( spawnArgs.GetFloat( "mass", "100" ) ); physicsObj.SetDelta( vec3_origin ); // Gravity idVec3 gravity = spawnArgs.GetVector( "gravityDir", "0 0 -1" ); gravity *= g_gravity.GetFloat ( ); physicsObj.SetGravity( gravity ); SetPhysics( &physicsObj ); animator.RemoveOriginOffset( true ); additionalDelta.Zero(); BecomeActive( TH_THINK ); }
void rvVehicleSpline::Spawn ( void ) { physicsObj.SetSelf( this ); physicsObj.SetClipModel( new idClipModel(GetPhysics()->GetClipModel()), 1.0f ); physicsObj.SetContents( CONTENTS_SOLID ); physicsObj.SetClipMask( 0 ); physicsObj.SetLinearVelocity( GetPhysics()->GetLinearVelocity() ); physicsObj.SetLinearAcceleration( spawnArgs.GetFloat( "accel", "200" ) ); physicsObj.SetLinearDeceleration( spawnArgs.GetFloat( "decel", "200" ) ); viewAxis = idAngles( 0, spawnArgs.GetFloat( "angle" ) , 0 ).ToMat3(); physicsObj.SetAxis( GetPhysics()->GetAxis() * viewAxis ); physicsObj.SetOrigin( GetPhysics()->GetOrigin() ); SetPhysics( &physicsObj ); BecomeActive( TH_THINK ); accelWithStrafe = Sign( spawnArgs.GetFloat("accel_strafe") ); idealSpeed = spawnArgs.GetFloat( "speed", "200" ); PostEventMS( &EV_PostSpawn, 0 ); }
/* ================ sdTeleporter::Spawn ================ */ void sdTeleporter::Spawn( void ) { BecomeActive( TH_THINK ); sdTeamManagerLocal& manager = sdTeamManager::GetInstance(); teamInfo.SetNum( manager.GetNumTeams() ); for ( int i = 0; i < manager.GetNumTeams(); i++ ) { sdTeamInfo& team = manager.GetTeamByIndex( i ); // default to enabled teamInfo[ i ].enabled = spawnArgs.GetBool( va( "%s_starts_enabled", team.GetLookupName() ), "1" ); } delay = spawnArgs.GetInt( "delay" ); exitVelocity = spawnArgs.GetVector( "velocity_exit", "100 0 0" ); deployReverse = spawnArgs.GetFloat( "deploy_reverse" ); deployLength = spawnArgs.GetFloat( "deploy_length" ); deployWidth = spawnArgs.GetFloat( "deploy_width" ); telefragDamage = DAMAGE_FOR_NAME( spawnArgs.GetString( "dmg_telefrag" ) ); // set up the physics const char* triggerModel = spawnArgs.GetString( "cm_trigger" ); staticPhysics.SetSelf( this ); staticPhysics.SetClipModel( new idClipModel( GetPhysics()->GetClipModel() ), 1.0f ); if ( triggerModel != NULL && *triggerModel ) { // the trigger for the physics staticPhysics.SetClipModel( new idClipModel( triggerModel ), 1.0f, 1 ); } staticPhysics.SetOrigin( GetPhysics()->GetOrigin() ); staticPhysics.SetAxis( GetPhysics()->GetAxis() ); SetPhysics( &staticPhysics ); }
/* ================ idBrittleFracture::CreateFractures ================ */ void idBrittleFracture::CreateFractures( const idRenderModel *renderModel ) { int i, j, k; const modelSurface_t *surf; const idDrawVert *v; idFixedWinding w; if ( !renderModel ) { return; } physicsObj.SetSelf( this ); physicsObj.SetOrigin( GetPhysics()->GetOrigin(), 0 ); physicsObj.SetAxis( GetPhysics()->GetAxis(), 0 ); for ( i = 0; i < 1 /*renderModel->NumSurfaces()*/; i++ ) { surf = renderModel->Surface( i ); material = surf->shader; for ( j = 0; j < surf->geometry->numIndexes; j += 3 ) { w.Clear(); for ( k = 0; k < 3; k++ ) { v = &surf->geometry->verts[ surf->geometry->indexes[ j + 2 - k ] ]; w.AddPoint( v->xyz ); w[k].s = v->st[0]; w[k].t = v->st[1]; } Fracture_r( w ); } } physicsObj.SetContents( material->GetContentFlags() ); SetPhysics( &physicsObj ); }
/* ================ idMoveableItem::Spawn ================ */ void idMoveableItem::Spawn( void ) { idTraceModel trm; float density, friction, bouncyness, tsize; idStr clipModelName; idBounds bounds; // create a trigger for item pickup spawnArgs.GetFloat( "triggersize", "16.0", tsize ); trigger = new idClipModel( idTraceModel( idBounds( vec3_origin ).Expand( tsize ) ) ); trigger->Link( gameLocal.clip, this, 0, GetPhysics()->GetOrigin(), GetPhysics()->GetAxis() ); trigger->SetContents( CONTENTS_TRIGGER ); // check if a clip model is set spawnArgs.GetString( "clipmodel", "", clipModelName ); if ( !clipModelName[0] ) { clipModelName = spawnArgs.GetString( "model" ); // use the visual model } // load the trace model if ( !collisionModelManager->TrmFromModel( clipModelName, trm ) ) { gameLocal.Error( "idMoveableItem '%s': cannot load collision model %s", name.c_str(), clipModelName.c_str() ); return; } // if the model should be shrinked if ( spawnArgs.GetBool( "clipshrink" ) ) { trm.Shrink( CM_CLIP_EPSILON ); } // get rigid body properties spawnArgs.GetFloat( "density", "0.5", density ); density = idMath::ClampFloat( 0.001f, 1000.0f, density ); spawnArgs.GetFloat( "friction", "0.05", friction ); friction = idMath::ClampFloat( 0.0f, 1.0f, friction ); spawnArgs.GetFloat( "bouncyness", "0.6", bouncyness ); bouncyness = idMath::ClampFloat( 0.0f, 1.0f, bouncyness ); // setup the physics physicsObj.SetSelf( this ); physicsObj.SetClipModel( new idClipModel( trm ), density ); physicsObj.SetOrigin( GetPhysics()->GetOrigin() ); physicsObj.SetAxis( GetPhysics()->GetAxis() ); physicsObj.SetBouncyness( bouncyness ); physicsObj.SetFriction( 0.6f, 0.6f, friction ); physicsObj.SetGravity( gameLocal.GetGravity() ); physicsObj.SetContents( CONTENTS_RENDERMODEL ); physicsObj.SetClipMask( MASK_SOLID | CONTENTS_MOVEABLECLIP ); SetPhysics( &physicsObj ); smoke = NULL; smokeTime = 0; const char *smokeName = spawnArgs.GetString( "smoke_trail" ); if ( *smokeName != '\0' ) { smoke = static_cast<const idDeclParticle *>( declManager->FindType( DECL_PARTICLE, smokeName ) ); smokeTime = gameLocal.time; BecomeActive( TH_UPDATEPARTICLES ); } }
/* ================ sdWalker::Spawn ================ */ void sdWalker::Spawn( void ) { animator.RemoveOriginOffset( true ); animator.ClearAllAnims( gameLocal.time, 0 ); animator.ClearAllJoints(); int anim = animator.GetAnim( "base" ); animator.PlayAnim( ANIMCHANNEL_TORSO, anim, gameLocal.time, 0 ); animator.CreateFrame( gameLocal.time, true ); LoadAF(); LoadVehicleScript(); if ( !spawnArgs.GetBool( "ik_disabled", "0" ) ) { LoadIK(); } physicsObj.SetSelf( this ); physicsObj.SetClipModel( new idClipModel( GetPhysics()->GetClipModel() ), 1.0f ); physicsObj.SetMass( spawnArgs.GetFloat( "mass", "10000" ) ); physicsObj.SetClipMask( MASK_VEHICLESOLID | CONTENTS_WALKERCLIP | CONTENTS_MONSTER ); // move up to make sure the monster is at least an epsilon above the floor physicsObj.SetOrigin( GetPhysics()->GetOrigin() + idVec3( 0, 0, CM_CLIP_EPSILON ) ); physicsObj.SetAxis( mat3_identity ); idVec3 gravity = spawnArgs.GetVector( "gravityDir", "0 0 -1" ); float gravityScale; if ( spawnArgs.GetFloat( "gravity", DEFAULT_GRAVITY_STRING, gravityScale ) ) { gravity *= gravityScale; } else { gravity *= g_gravity.GetFloat(); } physicsObj.SetGravity( gravity ); SetPhysics( &physicsObj ); BecomeActive( TH_THINK ); physicsObj.SetMaxStepHeight( spawnArgs.GetFloat( "ik_maxStepSpeed", "1" ) ); physicsObj.SetContents( CONTENTS_MONSTER ); stompDamage = gameLocal.declDamageType[ spawnArgs.GetString( "dmg_stomp" ) ]; minStompScale = spawnArgs.GetFloat( "stomp_min_scale" ); maxStompScale = spawnArgs.GetFloat( "stomp_max_scale" ); stompSpeedScale = spawnArgs.GetFloat( "stomp_speed_scale" ); groundPoundMinSpeed = spawnArgs.GetFloat( "ground_pound_min_speed", "200" ); groundPoundForce = spawnArgs.GetFloat( "ground_pound_force", "25000000" ); groundPoundRange = spawnArgs.GetFloat( "ground_pound_range", "512" ); kickForce = spawnArgs.GetFloat( "kick_force", "25000000" ); UpdateVisuals(); Present(); }
END_CLASS /* =========== hhForceField::Spawn =========== */ void hhForceField::Spawn(void) { fl.takedamage = true; SetShaderParm( SHADERPARM_TIMEOFFSET, 1.0f ); SetShaderParm( SHADERPARM_MODE, 0.0f ); fade = 0.0f; activationRate = spawnArgs.GetFloat( "activationRate" ); deactivationRate = spawnArgs.GetFloat( "deactivationRate" ); undamageFadeRate = spawnArgs.GetFloat( "undamageFadeRate" ); // BecomeActive( TH_THINK|TH_TICKER ); cachedContents = CONTENTS_FORCEFIELD | CONTENTS_BLOCK_RADIUSDAMAGE | CONTENTS_SHOOTABLE; physicsObj.SetSelf( this ); if (spawnArgs.GetBool("isSimpleBox")) { // Simple boxes are cheaper and can be bound to other objects physicsObj.SetClipModel( new idClipModel(idTraceModel(GetPhysics()->GetBounds())), 1.0f ); physicsObj.SetContents( cachedContents ); physicsObj.SetOrigin( GetOrigin() ); physicsObj.SetAxis( GetAxis() ); SetPhysics( &physicsObj ); } else { // Non-simple has real per-poly collision with it's model, uses default static physics because we don't have a tracemodel. // This loses the activation of contacts on the object (so some things may not fall through when disabled), but in my tests, // the spirit proxy falls through fine. NOTE: To fix the movables, etc. not falling when these are turned off, I'm manually // Activating appropriate physics that overlap the bounds when Turned off. // physicsObj.SetClipModel( new idClipModel(GetPhysics()->GetClipModel()), 1.0f ); // physicsObj.SetContents( cachedContents ); // physicsObj.SetOrigin( GetOrigin() ); // physicsObj.SetAxis( GetAxis() ); // SetPhysics( &physicsObj ); // Apparently the flags need to be on the material to make projectiles hit these. GetPhysics()->SetContents(cachedContents); } EnterOnState(); damagedState = false; nextCollideFxTime = gameLocal.time; fl.networkSync = true; //always want to sync over the net }
/* ============ sdGeneralMover::Spawn ============ */ void sdGeneralMover::Spawn( void ) { _physicsObj.SetSelf( this ); _physicsObj.SetClipModel( new idClipModel( GetPhysics()->GetClipModel() ), 1.f, 0 ); _physicsObj.SetInitialPosition( GetPhysics()->GetOrigin(), GetPhysics()->GetAxis() ); _physicsObj.SetClipMask( MASK_PLAYERSOLID, 0 ); SetPhysics( &_physicsObj ); _curMove.startPos = -1; _curMove.endPos = -1; _curMove.startTime = -1; _curMove.moveTime = -1; scriptEntityFlags.writeBind = true; }
/* ================ idBrittleFracture::CreateFractures ================ */ void idBrittleFracture::CreateFractures( const idRenderModel *renderModel ) { int i, j, k; const modelSurface_t *surf; const idDrawVert *v; idFixedWinding w; if ( !renderModel ) { return; } physicsObj.SetSelf( this ); physicsObj.SetOrigin( GetPhysics()->GetOrigin(), 0 ); physicsObj.SetAxis( GetPhysics()->GetAxis(), 0 ); for ( i = 0; i < 1 /*renderModel->NumSurfaces()*/; i++ ) { surf = renderModel->Surface( i ); material = surf->shader; for ( j = 0; j < surf->geometry->numIndexes; j += 3 ) { w.Clear(); for ( k = 0; k < 3; k++ ) { v = &surf->geometry->verts[ surf->geometry->indexes[ j + 2 - k ] ]; w.AddPoint( v->xyz ); w[k].s = v->st[0]; w[k].t = v->st[1]; } Fracture_r( w ); } } physicsObj.SetContents( material->GetContentFlags() ); // ishtvan: overwrite with custom contents if present if( m_CustomContents != -1 ) physicsObj.SetContents( m_CustomContents ); // SR CONTENTS_RESONSE FIX if( m_StimResponseColl->HasResponse() ) physicsObj.SetContents( physicsObj.GetContents() | CONTENTS_RESPONSE ); SetPhysics( &physicsObj ); }
/* ================ idTestModel::~idTestModel ================ */ idTestModel::~idTestModel() { StopSound( SND_CHANNEL_ANY, false ); if ( renderEntity.hModel ) { gameLocal.Printf( "Removing testmodel %s\n", renderEntity.hModel->Name() ); } else { gameLocal.Printf( "Removing testmodel\n" ); } if ( gameLocal.testmodel == this ) { gameLocal.testmodel = NULL; } if ( head.GetEntity() ) { // RAVEN BEGIN // ddynerman: allow instant respawning of head head.GetEntity()->SetName( va( "%s_oldhead", head.GetEntity()->name.c_str() ) ); // RAVEN END head.GetEntity()->StopSound( SND_CHANNEL_ANY, false ); head.GetEntity()->PostEventMS( &EV_Remove, 0 ); } SetPhysics( NULL ); }
/* ================ idTestModel::Spawn ================ */ void idTestModel::Spawn() { idVec3 size; idBounds bounds; const char* headModel; jointHandle_t joint; idStr jointName; idVec3 origin, modelOffset; idMat3 axis; const idKeyValue* kv; copyJoints_t copyJoint; if( renderEntity.hModel && renderEntity.hModel->IsDefaultModel() && !animator.ModelDef() ) { gameLocal.Warning( "Unable to create testmodel for '%s' : model defaulted", spawnArgs.GetString( "model" ) ); PostEventMS( &EV_Remove, 0 ); return; } mode = g_testModelAnimate.GetInteger(); animator.RemoveOriginOffset( g_testModelAnimate.GetInteger() == 1 ); physicsObj.SetSelf( this ); physicsObj.SetOrigin( GetPhysics()->GetOrigin() ); physicsObj.SetAxis( GetPhysics()->GetAxis() ); if( spawnArgs.GetVector( "mins", NULL, bounds[0] ) ) { spawnArgs.GetVector( "maxs", NULL, bounds[1] ); physicsObj.SetClipBox( bounds, 1.0f ); physicsObj.SetContents( 0 ); } else if( spawnArgs.GetVector( "size", NULL, size ) ) { bounds[ 0 ].Set( size.x * -0.5f, size.y * -0.5f, 0.0f ); bounds[ 1 ].Set( size.x * 0.5f, size.y * 0.5f, size.z ); physicsObj.SetClipBox( bounds, 1.0f ); physicsObj.SetContents( 0 ); } spawnArgs.GetVector( "offsetModel", "0 0 0", modelOffset ); // add the head model if it has one headModel = spawnArgs.GetString( "def_head", "" ); if( headModel[ 0 ] ) { jointName = spawnArgs.GetString( "head_joint" ); joint = animator.GetJointHandle( jointName ); if( joint == INVALID_JOINT ) { gameLocal.Warning( "Joint '%s' not found for 'head_joint'", jointName.c_str() ); } else { // copy any sounds in case we have frame commands on the head idDict args; const idKeyValue* sndKV = spawnArgs.MatchPrefix( "snd_", NULL ); while( sndKV ) { args.Set( sndKV->GetKey(), sndKV->GetValue() ); sndKV = spawnArgs.MatchPrefix( "snd_", sndKV ); } head = gameLocal.SpawnEntityType( idAnimatedEntity::Type, &args ); animator.GetJointTransform( joint, gameLocal.time, origin, axis ); origin = GetPhysics()->GetOrigin() + ( origin + modelOffset ) * GetPhysics()->GetAxis(); head.GetEntity()->SetModel( headModel ); head.GetEntity()->SetOrigin( origin ); head.GetEntity()->SetAxis( GetPhysics()->GetAxis() ); head.GetEntity()->BindToJoint( this, animator.GetJointName( joint ), true ); headAnimator = head.GetEntity()->GetAnimator(); // set up the list of joints to copy to the head for( kv = spawnArgs.MatchPrefix( "copy_joint", NULL ); kv != NULL; kv = spawnArgs.MatchPrefix( "copy_joint", kv ) ) { jointName = kv->GetKey(); if( jointName.StripLeadingOnce( "copy_joint_world " ) ) { copyJoint.mod = JOINTMOD_WORLD_OVERRIDE; } else { jointName.StripLeadingOnce( "copy_joint " ); copyJoint.mod = JOINTMOD_LOCAL_OVERRIDE; } copyJoint.from = animator.GetJointHandle( jointName ); if( copyJoint.from == INVALID_JOINT ) { gameLocal.Warning( "Unknown copy_joint '%s'", jointName.c_str() ); continue; } copyJoint.to = headAnimator->GetJointHandle( jointName ); if( copyJoint.to == INVALID_JOINT ) { gameLocal.Warning( "Unknown copy_joint '%s' on head", jointName.c_str() ); continue; } copyJoints.Append( copyJoint ); } } } // start any shader effects based off of the spawn time renderEntity.shaderParms[ SHADERPARM_TIMEOFFSET ] = -MS2SEC( gameLocal.time ); SetPhysics( &physicsObj ); gameLocal.Printf( "Added testmodel at origin = '%s', angles = '%s'\n", GetPhysics()->GetOrigin().ToString(), GetPhysics()->GetAxis().ToAngles().ToString() ); BecomeActive( TH_THINK ); }
END_CLASS idSecurityCamera::~idSecurityCamera() { SetPhysics( NULL ); }
rvVehicleSpline::~rvVehicleSpline ( void ) { SetPhysics( NULL ); }
rvVehicleAnimated::~rvVehicleAnimated ( void ) { SetPhysics( NULL ); }
/* ================ idTestModel::Spawn ================ */ void idTestModel::Spawn( void ) { idVec3 size; idBounds bounds; jointHandle_t joint; idStr jointName; idVec3 origin, modelOffset; idMat3 axis; copyJoints_t copyJoint; if ( renderEntity.hModel && renderEntity.hModel->IsDefaultModel() && !animator.ModelDef() ) { gameLocal.Warning( "Unable to create testmodel for '%s' : model defaulted", spawnArgs.GetString( "model" ) ); PostEventMS( &EV_Remove, 0 ); return; } mode = g_testModelAnimate.GetInteger(); animator.RemoveOriginOffset( g_testModelAnimate.GetInteger() == 1 ); physicsObj.SetSelf( this ); physicsObj.SetOrigin( GetPhysics()->GetOrigin() ); physicsObj.SetAxis( GetPhysics()->GetAxis() ); if ( spawnArgs.GetVector( "mins", NULL, bounds[0] ) ) { spawnArgs.GetVector( "maxs", NULL, bounds[1] ); physicsObj.SetClipBox( bounds, 1.0f ); physicsObj.SetContents( 0 ); } else if ( spawnArgs.GetVector( "size", NULL, size ) ) { bounds[ 0 ].Set( size.x * -0.5f, size.y * -0.5f, 0.0f ); bounds[ 1 ].Set( size.x * 0.5f, size.y * 0.5f, size.z ); physicsObj.SetClipBox( bounds, 1.0f ); physicsObj.SetContents( 0 ); } spawnArgs.GetVector( "offsetModel", "0 0 0", modelOffset ); // add the head model if it has one idStr headModelDefName = spawnArgs.GetString( "def_head" ); if ( !headModelDefName.IsEmpty() ) { jointName = spawnArgs.GetString( "head_joint" ); if (jointName.IsEmpty()) { // greebo: Second chance, use the CVAR, if no head_joint defined g_testModelHeadJoint.GetString(); } if (jointName.IsEmpty()) { jointName = "Spine2"; // fall back to hardcoded } joint = animator.GetJointHandle( jointName ); if ( joint == INVALID_JOINT ) { gameLocal.Warning( "Joint '%s' not found for 'head_joint'", jointName.c_str() ); } else { idDict args; const idDeclEntityDef* def = gameLocal.FindEntityDef(headModelDefName, false); if (def == NULL) { gameLocal.Warning("Could not find head entityDef %s!", headModelDefName.c_str()); // Try to fallback on the default head entityDef def = gameLocal.FindEntityDef(TDM_HEAD_ENTITYDEF, false); } if (def != NULL) { // Make a copy of the default spawnargs args = def->dict; } else { gameLocal.Warning("Could not find head entityDef %s or %s!", headModelDefName.c_str(), TDM_HEAD_ENTITYDEF); } // Copy any sounds in case we have frame commands on the head for (const idKeyValue* kv = spawnArgs.MatchPrefix("snd_", NULL); kv != NULL; kv = spawnArgs.MatchPrefix("snd_", kv)) { args.Set(kv->GetKey(), kv->GetValue()); } head = gameLocal.SpawnEntityType( idAnimatedEntity::Type, &args ); animator.GetJointTransform( joint, gameLocal.time, origin, axis ); origin = GetPhysics()->GetOrigin() + ( origin + modelOffset ) * GetPhysics()->GetAxis(); // Retrieve the actual model from the head entityDef idStr headModel = args.GetString("model"); if (headModel.IsEmpty()) { gameLocal.Warning("No 'model' spawnarg on head entityDef: %s", headModelDefName.c_str()); } head.GetEntity()->SetModel( headModel ); head.GetEntity()->SetOrigin( origin ); head.GetEntity()->SetAxis( GetPhysics()->GetAxis() ); head.GetEntity()->BindToJoint( this, animator.GetJointName( joint ), true ); headAnimator = head.GetEntity()->GetAnimator(); // set up the list of joints to copy to the head for(const idKeyValue* kv = spawnArgs.MatchPrefix( "copy_joint", NULL ); kv != NULL; kv = spawnArgs.MatchPrefix( "copy_joint", kv ) ) { jointName = kv->GetKey(); if ( jointName.StripLeadingOnce( "copy_joint_world " ) ) { copyJoint.mod = JOINTMOD_WORLD_OVERRIDE; } else { jointName.StripLeadingOnce( "copy_joint " ); copyJoint.mod = JOINTMOD_LOCAL_OVERRIDE; } copyJoint.from = animator.GetJointHandle( jointName ); if ( copyJoint.from == INVALID_JOINT ) { gameLocal.Warning( "Unknown copy_joint '%s'", jointName.c_str() ); continue; } copyJoint.to = headAnimator->GetJointHandle( jointName ); if ( copyJoint.to == INVALID_JOINT ) { gameLocal.Warning( "Unknown copy_joint '%s' on head", jointName.c_str() ); continue; } copyJoints.Append( copyJoint ); } } } // start any shader effects based off of the spawn time renderEntity.shaderParms[ SHADERPARM_TIMEOFFSET ] = -MS2SEC( gameLocal.time ); SetPhysics( &physicsObj ); gameLocal.Printf( "Added testmodel at origin = '%s', angles = '%s'\n", GetPhysics()->GetOrigin().ToString(), GetPhysics()->GetAxis().ToAngles().ToString() ); BecomeActive( TH_THINK ); }
/* ================ idBrittleFracture::CreateFractures ================ */ void idBrittleFracture::CreateFractures( const idRenderModel* renderModel ) { if( !renderModel || renderModel->NumSurfaces() < 1 ) { return; } physicsObj.SetSelf( this ); physicsObj.SetOrigin( GetPhysics()->GetOrigin(), 0 ); physicsObj.SetAxis( GetPhysics()->GetAxis(), 0 ); const modelSurface_t* surf = renderModel->Surface( 0 ); material = surf->shader; idMat3 physAxis; physAxis = physicsObj.GetAxis(); if( isXraySurface ) { idFixedWinding w; for( int i = 0; i < 4; i++ ) { const idDrawVert* v = &surf->geometry->verts[i]; w.AddPoint( idVec5( v->xyz, v->GetTexCoord() ) ); } idRandom2 random( entityNumber ); Fracture_r( w , random ); } else { const idDrawVert* verts = surf->geometry->verts; triIndex_t* indexes = surf->geometry->indexes; for( int j = 0; j < surf->geometry->numIndexes; j += 3 ) { int i0 = indexes[ j + 0 ]; int i1 = indexes[ j + 1 ]; int i2 = indexes[ j + 2 ]; idFixedWinding w; w.AddPoint( idVec5( verts[i2].xyz, verts[i2].GetTexCoord() ) ); w.AddPoint( idVec5( verts[i1].xyz, verts[i1].GetTexCoord() ) ); w.AddPoint( idVec5( verts[i0].xyz, verts[i0].GetTexCoord() ) ); idPlane p1; w.GetPlane( p1 ); for( int k = j + 3; k < surf->geometry->numIndexes && ( w.GetNumPoints() + 1 < MAX_POINTS_ON_WINDING ); k += 3 ) { int i3 = indexes[ k + 0 ]; int i4 = indexes[ k + 1 ]; int i5 = indexes[ k + 2 ]; idFixedWinding w2; w2.AddPoint( idVec5( verts[i5].xyz, verts[i5].GetTexCoord() ) ); w2.AddPoint( idVec5( verts[i4].xyz, verts[i4].GetTexCoord() ) ); w2.AddPoint( idVec5( verts[i3].xyz, verts[i3].GetTexCoord() ) ); idPlane p2; w2.GetPlane( p2 ); if( p1 != p2 ) { break; } bool found = false; for( int w1i = 0; w1i < w.GetNumPoints(); w1i++ ) { for( int w2i = 0; w2i < w2.GetNumPoints(); w2i++ ) { if( CompareVec5( w[w1i], w2[w2i] ) && CompareVec5( w[( w1i + 1 ) % w.GetNumPoints()], w2[( w2i + 2 ) % w2.GetNumPoints()] ) ) { w.InsertPoint( w2[( w2i + 1 ) % w2.GetNumPoints()], ( w1i + 1 ) % w.GetNumPoints() ); j = k; found = true; break; } } if( found ) { break; } } if( !found ) { break; } } idRandom2 random( entityNumber ); Fracture_r( w, random ); } } physicsObj.SetContents( material->GetContentFlags() ); SetPhysics( &physicsObj ); }
/* ================ idMoveable::Spawn ================ */ void idMoveable::Spawn( void ) { idTraceModel trm; float density, friction, bouncyness; int clipShrink; idStr clipModelName; bool setClipModel = false; idBounds bounds; // check if a clip model is set spawnArgs.GetString( "clipmodel", "", clipModelName ); if ( !clipModelName[0] ) { idVec3 size; if ( spawnArgs.GetVector( "mins", NULL, bounds[0] ) && spawnArgs.GetVector( "maxs", NULL, bounds[1] ) ) { setClipModel = true; if ( bounds[0][0] > bounds[1][0] || bounds[0][1] > bounds[1][1] || bounds[0][2] > bounds[1][2] ) { gameLocal.Error( "Invalid bounds '%s'-'%s' on moveable '%s'", bounds[0].ToString(), bounds[1].ToString(), name.c_str() ); } } else if ( spawnArgs.GetVector( "size", NULL, size ) ) { if ( ( size.x < 0.0f ) || ( size.y < 0.0f ) || ( size.z < 0.0f ) ) { gameLocal.Error( "Invalid size '%s' on moveable '%s'", size.ToString(), name.c_str() ); } bounds[0].Set( size.x * -0.5f, size.y * -0.5f, 0.0f ); bounds[1].Set( size.x * 0.5f, size.y * 0.5f, size.z ); setClipModel = true; } } if ( setClipModel ) { trm.SetupBox( bounds ); } else { if ( !clipModelName[0] ) { clipModelName = spawnArgs.GetString ( "model" ); // use the visual model } clipModelName.BackSlashesToSlashes(); if ( !collisionModelManager->TrmFromModel( gameLocal.GetMapName(), clipModelName, trm ) ) { gameLocal.Error( "idMoveable '%s': cannot load collision model %s", name.c_str(), clipModelName.c_str() ); return; } } // if the model should be shrinked clipShrink = spawnArgs.GetInt( "clipshrink" ); if ( clipShrink != 0 ) { trm.Shrink( clipShrink * CM_CLIP_EPSILON ); } // get rigid body properties spawnArgs.GetFloat( "density", "0.5", density ); density = idMath::ClampFloat( 0.001f, 1000.0f, density ); spawnArgs.GetFloat( "friction", "0.05", friction ); friction = idMath::ClampFloat( 0.0f, 1.0f, friction ); spawnArgs.GetFloat( "bouncyness", "0.6", bouncyness ); bouncyness = idMath::ClampFloat( 0.0f, 1.0f, bouncyness ); unbindOnDeath = spawnArgs.GetBool( "unbindondeath" ); nextCollideFxTime = 0; damage = spawnArgs.GetString( "def_damage", "" ); canDamage = spawnArgs.GetBool( "damageWhenActive" ) ? false : true; health = spawnArgs.GetInt( "health", "0" ); spawnArgs.GetString( "broken", "", brokenModel ); if ( health ) { if ( brokenModel != "" && !renderModelManager->CheckModel( brokenModel ) ) { gameLocal.Error( "idMoveable '%s' at (%s): cannot load broken model '%s'", name.c_str(), GetPhysics()->GetOrigin().ToString(0), brokenModel.c_str() ); } } fl.takedamage = (health > 0 ); // setup the physics physicsObj.SetSelf( this ); // RAVEN BEGIN // mwhitlock: Dynamic memory consolidation RV_PUSH_HEAP_MEM( this ); // RAVEN END physicsObj.SetClipModel( new idClipModel( trm, GetRenderModelMaterial() ), density ); // RAVEN BEGIN // mwhitlock: Dynamic memory consolidation RV_POP_HEAP(); // RAVEN END physicsObj.SetOrigin( GetPhysics()->GetOrigin() ); physicsObj.SetAxis( GetPhysics()->GetAxis() ); physicsObj.SetBouncyness( bouncyness ); physicsObj.SetFriction( 0.6f, 0.6f, friction ); physicsObj.SetGravity( gameLocal.GetGravity() ); physicsObj.SetContents( CONTENTS_SOLID ); physicsObj.SetClipMask( MASK_SOLID | CONTENTS_BODY | CONTENTS_CORPSE | CONTENTS_MOVEABLECLIP | CONTENTS_WATER ); SetPhysics( &physicsObj ); if ( spawnArgs.GetBool( "nodrop" ) ) { physicsObj.PutToRest(); } else { physicsObj.DropToFloor(); } if ( spawnArgs.GetBool( "noimpact" ) || spawnArgs.GetBool( "notPushable" ) ) { physicsObj.DisableImpact(); } if ( spawnArgs.GetBool( "nonsolid" ) ) { BecomeNonSolid(); } allowStep = spawnArgs.GetBool( "allowStep", "1" ); // RAVEN BEGIN // cdr: Obstacle Avoidance fl.isAIObstacle = !physicsObj.IsPushable(); // RAVEN END PostEventMS( &EV_SetOwnerFromSpawnArgs, 0 ); }
/* ================ idMoveable::Spawn ================ */ void idMoveable::Spawn( void ) { idTraceModel trm; float density, friction, bouncyness, mass, air_friction_linear, air_friction_angular; int clipShrink; idStr clipModelName; idVec3 maxForce, maxTorque; // check if a clip model is set spawnArgs.GetString( "clipmodel", "", clipModelName ); if( !clipModelName[0] ) { clipModelName = spawnArgs.GetString( "model" ); // use the visual model } // tels: support "model" "" with "noclipmodel" "0" - do not attempt to load // the clipmodel from the non-existing model name in this case: if( clipModelName.Length() ) { if( !collisionModelManager->TrmFromModel( clipModelName, trm ) ) { gameLocal.Error( "idMoveable '%s': cannot load collision model %s", name.c_str(), clipModelName.c_str() ); return; } // angua: check if the cm is valid if( idMath::Fabs( trm.bounds[0].x ) == idMath::INFINITY ) { gameLocal.Error( "idMoveable '%s': invalid collision model %s", name.c_str(), clipModelName.c_str() ); } // if the model should be shrunk clipShrink = spawnArgs.GetInt( "clipshrink" ); if( clipShrink != 0 ) { trm.Shrink( clipShrink * CM_CLIP_EPSILON ); } } // get rigid body properties spawnArgs.GetFloat( "density", "0.5", density ); density = idMath::ClampFloat( 0.001f, 1000.0f, density ); spawnArgs.GetFloat( "bouncyness", "0.6", bouncyness ); bouncyness = idMath::ClampFloat( 0.0f, 1.0f, bouncyness ); explode = spawnArgs.GetBool( "explode" ); unbindOnDeath = spawnArgs.GetBool( "unbindondeath" ); spawnArgs.GetFloat( "friction", "0.05", friction ); // reverse compatibility, new contact_friction key replaces friction only if present if( spawnArgs.FindKey( "contact_friction" ) ) { spawnArgs.GetFloat( "contact_friction", "0.05", friction ); } spawnArgs.GetFloat( "linear_friction", "0.6", air_friction_linear ); spawnArgs.GetFloat( "angular_friction", "0.6", air_friction_angular ); fxCollide = spawnArgs.GetString( "fx_collide" ); nextCollideFxTime = 0; // tels: m_scriptCollide = spawnArgs.GetString( "script_collide" ); m_nextCollideScriptTime = 0; m_collideScriptCounter = spawnArgs.GetInt( "collide_script_counter", "1" ); // override the default of 1 with 0 if no script is defined if( m_scriptCollide == "" ) { m_collideScriptCounter = 0; } m_minScriptVelocity = spawnArgs.GetFloat( "min_script_velocity", "5.0" ); damage = spawnArgs.GetString( "def_damage", "" ); canDamage = spawnArgs.GetBool( "damageWhenActive" ) ? false : true; minDamageVelocity = spawnArgs.GetFloat( "minDamageVelocity", "-1" ); if( minDamageVelocity == -1 ) { // grayman #2816 minDamageVelocity = MIN_DAMAGE_VELOCITY; } maxDamageVelocity = spawnArgs.GetFloat( "maxDamageVelocity", "-1" ); if( maxDamageVelocity == -1 ) { // grayman #2816 maxDamageVelocity = MAX_DAMAGE_VELOCITY; } nextDamageTime = 0; nextSoundTime = 0; health = spawnArgs.GetInt( "health", "0" ); // tels: load a visual model, as well as an optional brokenModel LoadModels(); // setup the physics physicsObj.SetSelf( this ); physicsObj.SetClipModel( new idClipModel( trm ), density ); physicsObj.GetClipModel()->SetMaterial( GetRenderModelMaterial() ); physicsObj.SetOrigin( GetPhysics()->GetOrigin() ); physicsObj.SetAxis( GetPhysics()->GetAxis() ); physicsObj.SetBouncyness( bouncyness ); physicsObj.SetFriction( air_friction_linear, air_friction_angular, friction ); physicsObj.SetGravity( gameLocal.GetGravity() ); int contents = CONTENTS_SOLID | CONTENTS_OPAQUE; // ishtvan: overwrite with custom contents, if present if( m_CustomContents != -1 ) { contents = m_CustomContents; } // greebo: Set the frobable contents flag if the spawnarg says so if( spawnArgs.GetBool( "frobable", "0" ) ) { contents |= CONTENTS_FROBABLE; } physicsObj.SetContents( contents ); physicsObj.SetClipMask( MASK_SOLID | CONTENTS_BODY | CONTENTS_CORPSE | CONTENTS_MOVEABLECLIP ); SetPhysics( &physicsObj ); if( spawnArgs.GetFloat( "mass", "10", mass ) ) { physicsObj.SetMass( mass ); } // tels if( spawnArgs.GetVector( "max_force", "", maxForce ) ) { physicsObj.SetMaxForce( maxForce ); } if( spawnArgs.GetVector( "max_torque", "", maxTorque ) ) { physicsObj.SetMaxTorque( maxTorque ); } if( spawnArgs.GetBool( "nodrop" ) ) { physicsObj.PutToRest(); } else { physicsObj.DropToFloor(); } if( spawnArgs.GetBool( "noimpact" ) || spawnArgs.GetBool( "notpushable" ) ) { physicsObj.DisableImpact(); } if( !spawnArgs.GetBool( "solid" ) ) { BecomeNonSolid(); } // SR CONTENTS_RESPONSE FIX if( m_StimResponseColl->HasResponse() ) { physicsObj.SetContents( physicsObj.GetContents() | CONTENTS_RESPONSE ); } m_preHideContents = physicsObj.GetContents(); m_preHideClipMask = physicsObj.GetClipMask(); allowStep = spawnArgs.GetBool( "allowStep", "1" ); // parse LOD spawnargs if( ParseLODSpawnargs( &spawnArgs, gameLocal.random.RandomFloat() ) ) { // Have to start thinking if we're distance dependent BecomeActive( TH_THINK ); } // grayman #2820 - don't queue EV_SetOwnerFromSpawnArgs if it's going to // end up doing nothing. Queuing this for every moveable causes a lot // of event posting during frame 0. If extra work is added to // EV_SetOwnerFromSpawnArgs, then that must be accounted for here, to // make sure it has a chance of getting done. idStr owner; if( spawnArgs.GetString( "owner", "", owner ) ) { PostEventMS( &EV_SetOwnerFromSpawnArgs, 0 ); } }
/* ================ idTestModel::Spawn ================ */ void idTestModel::Spawn( void ) { idVec3 size; idBounds bounds; const char *headModel; jointHandle_t joint; idStr jointName; idVec3 origin, modelOffset; idMat3 axis; const idKeyValue *kv; copyJoints_t copyJoint; // RAVEN BEGIN // ddynerman: new heads idAFAttachment *headEnt; // RAVEN END if ( renderEntity.hModel && renderEntity.hModel->IsDefaultModel() && !animator.ModelDef() ) { gameLocal.Warning( "Unable to create testmodel for '%s' : model defaulted", spawnArgs.GetString( "model" ) ); PostEventMS( &EV_Remove, 0 ); return; } mode = g_testModelAnimate.GetInteger(); animator.RemoveOriginOffset( g_testModelAnimate.GetInteger() == 1 ); physicsObj.SetSelf( this ); physicsObj.SetOrigin( GetPhysics()->GetOrigin() ); physicsObj.SetAxis( GetPhysics()->GetAxis() ); if ( spawnArgs.GetVector( "mins", NULL, bounds[0] ) ) { spawnArgs.GetVector( "maxs", NULL, bounds[1] ); physicsObj.SetClipBox( bounds, 1.0f ); physicsObj.SetContents( 0 ); } else if ( spawnArgs.GetVector( "size", NULL, size ) ) { bounds[ 0 ].Set( size.x * -0.5f, size.y * -0.5f, 0.0f ); bounds[ 1 ].Set( size.x * 0.5f, size.y * 0.5f, size.z ); physicsObj.SetClipBox( bounds, 1.0f ); physicsObj.SetContents( 0 ); } spawnArgs.GetVector( "offsetModel", "0 0 0", modelOffset ); // add the head model if it has one headModel = spawnArgs.GetString( "def_head", "" ); if ( headModel[ 0 ] ) { // RAVEN BEGIN // ddynerman: new heads jointName = spawnArgs.GetString( "joint_head" ); joint = animator.GetJointHandle( jointName ); if ( joint == INVALID_JOINT ) { gameLocal.Warning( "Joint '%s' not found for 'joint_head'", jointName.c_str() ); } else { // copy any sounds in case we have frame commands on the head idDict args; const idKeyValue *sndKV = spawnArgs.MatchPrefix( "snd_", NULL ); while( sndKV ) { args.Set( sndKV->GetKey(), sndKV->GetValue() ); sndKV = spawnArgs.MatchPrefix( "snd_", sndKV ); } args.Set( "classname", headModel ); if( !gameLocal.SpawnEntityDef( args, ( idEntity ** )&headEnt ) ) { gameLocal.Warning( "idTestModel::Spawn() - Unknown head model '%s'\n", headModel ); return; } headEnt->spawnArgs.Set( "classname", headModel ); headEnt->SetName( va( "%s_head", name.c_str() ) ); headEnt->SetBody ( this, headEnt->spawnArgs.GetString ( "model" ), joint ); headEnt->BindToJoint( this, joint, true ); headEnt->SetOrigin( vec3_origin ); headEnt->SetAxis( mat3_identity ); headEnt->InitCopyJoints ( ); head = headEnt; // RAVEN END headAnimator = head.GetEntity()->GetAnimator(); // set up the list of joints to copy to the head for( kv = spawnArgs.MatchPrefix( "copy_joint", NULL ); kv != NULL; kv = spawnArgs.MatchPrefix( "copy_joint", kv ) ) { jointName = kv->GetKey(); if ( jointName.StripLeadingOnce( "copy_joint_world " ) ) { copyJoint.mod = JOINTMOD_WORLD_OVERRIDE; } else { jointName.StripLeadingOnce( "copy_joint " ); copyJoint.mod = JOINTMOD_LOCAL_OVERRIDE; } copyJoint.from = animator.GetJointHandle( jointName ); if ( copyJoint.from == INVALID_JOINT ) { gameLocal.Warning( "Unknown copy_joint '%s'", jointName.c_str() ); continue; } copyJoint.to = headAnimator->GetJointHandle( jointName ); if ( copyJoint.to == INVALID_JOINT ) { gameLocal.Warning( "Unknown copy_joint '%s' on head", jointName.c_str() ); continue; } copyJoints.Append( copyJoint ); } } } // start any shader effects based off of the spawn time renderEntity.shaderParms[ SHADERPARM_TIMEOFFSET ] = -MS2SEC( gameLocal.time ); SetPhysics( &physicsObj ); // always keep updating so we can see the skeleton for the default pose fl.forcePhysicsUpdate = true; gameLocal.Printf( "Added testmodel at origin = '%s', angles = '%s'\n", GetPhysics()->GetOrigin().ToString(), GetPhysics()->GetAxis().ToAngles().ToString() ); BecomeActive( TH_THINK ); }
/* ================ idMoveable::Spawn ================ */ void idMoveable::Spawn( void ) { idTraceModel trm; float density, friction, bouncyness, mass; int clipShrink; idStr clipModelName; // check if a clip model is set spawnArgs.GetString( "clipmodel", "", clipModelName ); if ( !clipModelName[0] ) { clipModelName = spawnArgs.GetString( "model" ); // use the visual model } if ( !collisionModelManager->TrmFromModel( clipModelName, trm ) ) { gameLocal.Error( "idMoveable '%s': cannot load collision model %s", name.c_str(), clipModelName.c_str() ); return; } // if the model should be shrinked clipShrink = spawnArgs.GetInt( "clipshrink" ); if ( clipShrink != 0 ) { trm.Shrink( clipShrink * CM_CLIP_EPSILON ); } // get rigid body properties spawnArgs.GetFloat( "density", "0.5", density ); density = idMath::ClampFloat( 0.001f, 1000.0f, density ); spawnArgs.GetFloat( "friction", "0.05", friction ); friction = idMath::ClampFloat( 0.0f, 1.0f, friction ); spawnArgs.GetFloat( "bouncyness", "0.6", bouncyness ); bouncyness = idMath::ClampFloat( 0.0f, 1.0f, bouncyness ); explode = spawnArgs.GetBool( "explode" ); unbindOnDeath = spawnArgs.GetBool( "unbindondeath" ); fxCollide = spawnArgs.GetString( "fx_collide" ); nextCollideFxTime = 0; fl.takedamage = true; damage = spawnArgs.GetString( "def_damage", "" ); canDamage = spawnArgs.GetBool( "damageWhenActive" ) ? false : true; minDamageVelocity = spawnArgs.GetFloat( "minDamageVelocity", "100" ); maxDamageVelocity = spawnArgs.GetFloat( "maxDamageVelocity", "200" ); nextDamageTime = 0; nextSoundTime = 0; health = spawnArgs.GetInt( "health", "0" ); spawnArgs.GetString( "broken", "", brokenModel ); if ( health ) { if ( brokenModel != "" && !renderModelManager->CheckModel( brokenModel ) ) { gameLocal.Error( "idMoveable '%s' at (%s): cannot load broken model '%s'", name.c_str(), GetPhysics()->GetOrigin().ToString(0), brokenModel.c_str() ); } } // setup the physics physicsObj.SetSelf( this ); physicsObj.SetClipModel( new idClipModel( trm ), density ); physicsObj.GetClipModel()->SetMaterial( GetRenderModelMaterial() ); physicsObj.SetOrigin( GetPhysics()->GetOrigin() ); physicsObj.SetAxis( GetPhysics()->GetAxis() ); physicsObj.SetBouncyness( bouncyness ); physicsObj.SetFriction( 0.6f, 0.6f, friction ); physicsObj.SetGravity( gameLocal.GetGravity() ); physicsObj.SetContents( CONTENTS_SOLID ); physicsObj.SetClipMask( MASK_SOLID | CONTENTS_BODY | CONTENTS_CORPSE | CONTENTS_MOVEABLECLIP ); SetPhysics( &physicsObj ); if ( spawnArgs.GetFloat( "mass", "10", mass ) ) { physicsObj.SetMass( mass ); } if ( spawnArgs.GetBool( "nodrop" ) ) { physicsObj.PutToRest(); } else { physicsObj.DropToFloor(); } if ( spawnArgs.GetBool( "noimpact" ) || spawnArgs.GetBool( "notPushable" ) ) { physicsObj.DisableImpact(); } if ( spawnArgs.GetBool( "nonsolid" ) ) { BecomeNonSolid(); } allowStep = spawnArgs.GetBool( "allowStep", "1" ); PostEventMS( &EV_SetOwnerFromSpawnArgs, 0 ); }
/* ================ idMoveable::~idMoveable ================ */ idMoveable::~idMoveable( void ) { delete initialSpline; initialSpline = NULL; SetPhysics( NULL ); }