END_CLASS /* ================ idTrigger::DrawDebugInfo ================ */ void idTrigger::DrawDebugInfo( void ) { idMat3 axis = gameLocal.GetLocalPlayer()->viewAngles.ToMat3(); idVec3 up = axis[ 2 ] * 5.0f; idBounds viewTextBounds( gameLocal.GetLocalPlayer()->GetPhysics()->GetOrigin() ); idBounds viewBounds( gameLocal.GetLocalPlayer()->GetPhysics()->GetOrigin() ); idBounds box( idVec3( -4.0f, -4.0f, -4.0f ), idVec3( 4.0f, 4.0f, 4.0f ) ); idEntity *ent; idEntity *target; int i; bool show; const function_t *func; viewTextBounds.ExpandSelf( 128.0f ); viewBounds.ExpandSelf( 512.0f ); for( ent = gameLocal.spawnedEntities.Next(); ent != NULL; ent = ent->spawnNode.Next() ) { if ( ent->GetPhysics()->GetContents() & ( CONTENTS_TRIGGER | CONTENTS_FLASHLIGHT_TRIGGER ) ) { show = viewBounds.IntersectsBounds( ent->GetPhysics()->GetAbsBounds() ); if ( !show ) { for( i = 0; i < ent->targets.Num(); i++ ) { target = ent->targets[ i ].GetEntity(); if ( target && viewBounds.IntersectsBounds( target->GetPhysics()->GetAbsBounds() ) ) { show = true; break; } } } if ( !show ) { continue; } gameRenderWorld->DebugBounds( colorOrange, ent->GetPhysics()->GetAbsBounds() ); if ( viewTextBounds.IntersectsBounds( ent->GetPhysics()->GetAbsBounds() ) ) { gameRenderWorld->DrawText( ent->name.c_str(), ent->GetPhysics()->GetAbsBounds().GetCenter(), 0.1f, colorWhite, axis, 1 ); gameRenderWorld->DrawText( ent->GetEntityDefName(), ent->GetPhysics()->GetAbsBounds().GetCenter() + up, 0.1f, colorWhite, axis, 1 ); if ( ent->IsType( idTrigger::Type ) ) { func = static_cast<idTrigger *>( ent )->GetScriptFunction(); } else { func = NULL; } if ( func ) { gameRenderWorld->DrawText( va( "call script '%s'", func->Name() ), ent->GetPhysics()->GetAbsBounds().GetCenter() - up, 0.1f, colorWhite, axis, 1 ); } } for( i = 0; i < ent->targets.Num(); i++ ) { target = ent->targets[ i ].GetEntity(); if ( target ) { gameRenderWorld->DebugArrow( colorYellow, ent->GetPhysics()->GetAbsBounds().GetCenter(), target->GetPhysics()->GetOrigin(), 10, 0 ); gameRenderWorld->DebugBounds( colorGreen, box, target->GetPhysics()->GetOrigin() ); if ( viewTextBounds.IntersectsBounds( target->GetPhysics()->GetAbsBounds() ) ) { gameRenderWorld->DrawText( target->name.c_str(), target->GetPhysics()->GetAbsBounds().GetCenter(), 0.1f, colorWhite, axis, 1 ); } } } } } }
/* ============= idEditEntities::DisplayEntities ============= */ void idEditEntities::DisplayEntities( void ) { idEntity *ent; if ( !gameLocal.GetLocalPlayer() ) { return; } selectableEntityClasses.Clear(); selectedTypeInfo_t sit; switch( g_editEntityMode.GetInteger() ) { case 1: sit.typeInfo = &idLight::Type; sit.textKey = "texture"; selectableEntityClasses.Append( sit ); break; case 2: sit.typeInfo = &idSound::Type; sit.textKey = "s_shader"; selectableEntityClasses.Append( sit ); sit.typeInfo = &idLight::Type; sit.textKey = "texture"; selectableEntityClasses.Append( sit ); break; case 3: sit.typeInfo = &idAFEntity_Base::Type; sit.textKey = "articulatedFigure"; selectableEntityClasses.Append( sit ); break; case 4: sit.typeInfo = &idFuncEmitter::Type; sit.textKey = "model"; selectableEntityClasses.Append( sit ); break; case 5: sit.typeInfo = &idAI::Type; sit.textKey = "name"; selectableEntityClasses.Append( sit ); break; case 6: sit.typeInfo = &idEntity::Type; sit.textKey = "name"; selectableEntityClasses.Append( sit ); break; case 7: sit.typeInfo = &idEntity::Type; sit.textKey = "model"; selectableEntityClasses.Append( sit ); break; default: return; } idBounds viewBounds( gameLocal.GetLocalPlayer()->GetPhysics()->GetOrigin() ); idBounds viewTextBounds( gameLocal.GetLocalPlayer()->GetPhysics()->GetOrigin() ); idMat3 axis = gameLocal.GetLocalPlayer()->viewAngles.ToMat3(); viewBounds.ExpandSelf( 512 ); viewTextBounds.ExpandSelf( 128 ); idStr textKey; for( ent = gameLocal.spawnedEntities.Next(); ent != NULL; ent = ent->spawnNode.Next() ) { idVec4 color; textKey = ""; if ( !EntityIsSelectable( ent, &color, &textKey ) ) { continue; } bool drawArrows = false; if ( ent->GetType() == &idAFEntity_Base::Type ) { if ( !static_cast<idAFEntity_Base *>(ent)->IsActiveAF() ) { continue; } } else if ( ent->GetType() == &idSound::Type ) { if ( ent->fl.selected ) { drawArrows = true; } const idSoundShader * ss = declManager->FindSound( ent->spawnArgs.GetString( textKey ) ); if ( ss->HasDefaultSound() || ss->base->GetState() == DS_DEFAULTED ) { color.Set( 1.0f, 0.0f, 1.0f, 1.0f ); } } else if ( ent->GetType() == &idFuncEmitter::Type ) { if ( ent->fl.selected ) { drawArrows = true; } } if ( !viewBounds.ContainsPoint( ent->GetPhysics()->GetOrigin() ) ) { continue; } gameRenderWorld->DebugBounds( color, idBounds( ent->GetPhysics()->GetOrigin() ).Expand( 8 ) ); if ( drawArrows ) { idVec3 start = ent->GetPhysics()->GetOrigin(); idVec3 end = start + idVec3( 1, 0, 0 ) * 20.0f; gameRenderWorld->DebugArrow( colorWhite, start, end, 2 ); gameRenderWorld->DrawText( "x+", end + idVec3( 4, 0, 0 ), 0.15f, colorWhite, axis ); end = start + idVec3( 1, 0, 0 ) * -20.0f; gameRenderWorld->DebugArrow( colorWhite, start, end, 2 ); gameRenderWorld->DrawText( "x-", end + idVec3( -4, 0, 0 ), 0.15f, colorWhite, axis ); end = start + idVec3( 0, 1, 0 ) * +20.0f; gameRenderWorld->DebugArrow( colorGreen, start, end, 2 ); gameRenderWorld->DrawText( "y+", end + idVec3( 0, 4, 0 ), 0.15f, colorWhite, axis ); end = start + idVec3( 0, 1, 0 ) * -20.0f; gameRenderWorld->DebugArrow( colorGreen, start, end, 2 ); gameRenderWorld->DrawText( "y-", end + idVec3( 0, -4, 0 ), 0.15f, colorWhite, axis ); end = start + idVec3( 0, 0, 1 ) * +20.0f; gameRenderWorld->DebugArrow( colorBlue, start, end, 2 ); gameRenderWorld->DrawText( "z+", end + idVec3( 0, 0, 4 ), 0.15f, colorWhite, axis ); end = start + idVec3( 0, 0, 1 ) * -20.0f; gameRenderWorld->DebugArrow( colorBlue, start, end, 2 ); gameRenderWorld->DrawText( "z-", end + idVec3( 0, 0, -4 ), 0.15f, colorWhite, axis ); } if ( textKey.Length() ) { const char *text = ent->spawnArgs.GetString( textKey ); if ( viewTextBounds.ContainsPoint( ent->GetPhysics()->GetOrigin() ) ) { gameRenderWorld->DrawText( text, ent->GetPhysics()->GetOrigin() + idVec3(0, 0, 12), 0.25, colorWhite, axis, 1 ); } } } }