void Polygon::DrawAxes(sf::RenderWindow& rw) { //Length of axes const int lineLength = 200; //Gets SAT axes auto axes = GetAxes(); double angle, x, y, length; //Stores line information sf::VertexArray line(sf::Lines, 2); line[0].color = sf::Color::Black; line[1].color = sf::Color::Black; sf::Vector2f edge; for (int i = 0; i < axes.size(); ++i) { //Get the slope of the axis angle = atan(axes[i].y / axes[i].x); //Centroid of polygon acts as midpoint of all axes, so we calculate x and y using half length x = cos(angle)*lineLength / 2; y = sin(angle)*lineLength / 2; //Set position of the endpoints of the axes line[0].position = sf::Vector2f(m_shape.getPosition().x - x, m_shape.getPosition().y - y); line[1].position = sf::Vector2f(m_shape.getPosition().x + x, m_shape.getPosition().y + y); //Draw the line rw.draw(line); } }
BOOL DTransformNewObject::OnSetActive() { // TODO: Add your specialized code here and/or call the base class GView *view = GetView(); // make translation event handler active GNewObjectHandler *h = new GNewObjectHandler(view); h->SetMapMode(m_type); h->SetTransformMode(GMoveTransformHandler::MODE_TRANSLATE); h->SetDialog(this); h->SetAxes(GetAxes()); h->copyObject = !m_share; h->group = (GvNode*) view->GetScene(); h->SetObjectType(m_object_type); h->ref(); m_pView->Message("Click to insert new objects"); m_handler = h; view->PushEventHandler(h); return CPropertyPage::OnSetActive(); }
void DTransformPosition::OnTypeScreen() { UpdateData(1); if (!m_handler) return; m_handler->SetMapMode(m_type); m_handler->SetAxes(GetAxes()); }
void DTransformPosition::OnControlClicked(UINT ctrl) { UpdateData(1); if (!m_handler) return; m_handler->SetMapMode(m_type); m_handler->SetAxes(GetAxes()); }
FVector WorldToScreen(UCanvas* pCanvas, FVector Location ) { FVector Return; FVector Loc; FVector AxisX, AxisY, AxisZ, Delta, Transformed; FRotator Rot; if (!pPC) { return Return; } if( !pPC->Pawn->IsA( AVehicle::StaticClass()) ) { pPC->Pawn->eventGetActorEyesViewPoint( &Loc, &Rot ); } else if( pPC->Pawn->IsA( ASVehicle::StaticClass()) ) { ASVehicle* Vehicle = (ASVehicle*)pPC->Pawn; char* VehicleName = Vehicle->GetFullName(); if( !strcmp( VehicleName, "TrVehicle_GravCycle TheWorld.PersistentLevel.TrVehicle_GravCycle" ) || !strcmp( VehicleName, "TrVehicle_Beowulf TheWorld.PersistentLevel.TrVehicle_Beowulf") ) { float FOV, DeltaTime; Vehicle->CalcCamera( DeltaTime, &Loc, &Rot, &FOV ); } else if( !strcmp( VehicleName, "TrVehicle_Shrike TheWorld.PersistentLevel.TrVehicle_Shrike" ) ) { pPC->eventGetPlayerViewPoint( &Loc, &Rot ); } } GetAxes( Rot , AxisX, AxisY, AxisZ ); Delta = pPC->Subtract_VectorVector( Location, Loc ); Transformed.X = pPC->Dot_VectorVector( Delta, AxisY ); Transformed.Y = pPC->Dot_VectorVector( Delta, AxisZ ); Transformed.Z = pPC->Dot_VectorVector( Delta, AxisX ); if( Transformed.Z < 1.00f ) Transformed.Z = 1.00f; float FOVAngle = pPC->FOVAngle; Return.X = ( pCanvas->ClipX / 2.0f ) + Transformed.X * ( ( pCanvas->ClipX / 2.0f ) / pPC->Tan( FOVAngle * CONST_Pi / 360.0f ) ) / Transformed.Z; Return.Y = ( pCanvas->ClipY / 2.0f ) + -Transformed.Y * ( ( pCanvas->ClipX / 2.0f ) / pPC->Tan( FOVAngle * CONST_Pi / 360.0f ) ) / Transformed.Z; Return.Z = 0; return Return; }
// send value in edit field to handler void DTransformPosition::ApplyValue() { if (!UpdateData(TRUE)) return; if (!m_handler) return; m_handler->SetValue(m_value); m_handler->SetMapMode(m_type); m_handler->SetAxes(GetAxes()); //CDataExchange DX(this,TRUE); //DDX_Text(&DX, IDC_VALUE, m_value); }
BOOL DTransformPosition::OnSetActive() { GView *view = GetView(); // make translation event handler active GMoveTransformHandler *h = new GMoveTransformHandler(view); h->SetMapMode(m_type); h->SetTransformMode(GMoveTransformHandler::MODE_TRANSLATE); h->SetDialog(this); h->SetAxes(GetAxes()); h->scaleUniform = FALSE; h->ref(); m_pView->Message("Select and drag translates object"); m_handler = h; view->PushEventHandler(h); return CPropertyPage::OnSetActive(); }
BOOL DTransformRotation::OnSetActive() { // TODO: Add your specialized code here and/or call the base class // return DTransformScale::OnSetActive(); GView *view = GetView(); // make translation event handler active GMoveTransformHandler *h = new GMoveTransformHandler(view); h->SetMapMode(m_type); h->SetTransformMode(GMoveTransformHandler::MODE_ROTATE); h->SetDialog(this); h->SetAxes(GetAxes()); h->rotateTrackball = m_trackball; h->ref(); m_pView->Message("Select and drag scales object"); m_handler = h; view->PushEventHandler(h); return CPropertyPage::OnSetActive(); }
void UVaOceanBuoyancyComponent::PerformWaveReaction(float DeltaTime) { AActor* MyOwner = GetOwner(); if (!UpdatedComponent || MyOwner == NULL) { return; } UPrimitiveComponent* OldPrimitive = Cast<UPrimitiveComponent>(UpdatedComponent); const FVector OldLocation = MyOwner->GetActorLocation(); const FRotator OldRotation = MyOwner->GetActorRotation(); const FVector OldLinearVelocity = OldPrimitive->GetPhysicsLinearVelocity(); const FVector OldAngularVelocity = OldPrimitive->GetPhysicsAngularVelocity(); const FVector OldCenterOfMassWorld = OldLocation + OldRotation.RotateVector(COMOffset); const FVector OwnerScale = MyOwner->GetActorScale(); // XYZ === Throttle, Steering, Rise == Forwards, Sidewards, Upwards FVector X, Y, Z; GetAxes(OldRotation, X, Y, Z); // Process tension dots and get torque from wind/waves for (FVector TensionDot : TensionDots) { // Translate point to world coordinates FVector TensionDotDisplaced = OldRotation.RotateVector(TensionDot + COMOffset); FVector TensionDotWorld = OldLocation + TensionDotDisplaced; // Get point depth float DotAltitude = GetAltitude(TensionDotWorld); // Don't process dots above water if (DotAltitude > 0) { continue; } // Surface normal (not modified!) FVector DotSurfaceNormal = GetSurfaceNormal(TensionDotWorld) * GetSurfaceWavesNum(); // Modify normal with real Z value and normalize it DotSurfaceNormal.Z = GetOceanLevel(TensionDotWorld); DotSurfaceNormal.Normalize(); // Point dynamic pressure [http://en.wikipedia.org/wiki/Dynamic_pressure] // rho = 1.03f for ocean water FVector WaveVelocity = GetWaveVelocity(TensionDotWorld); float DotQ = 0.515f * FMath::Square(WaveVelocity.Size()); FVector WaveForce = FVector(0.0,0.0,1.0) * DotQ /* DotSurfaceNormal*/ * (-DotAltitude) * TensionDepthFactor; // We don't want Z to be affected by DotQ WaveForce.Z /= DotQ; // Scale to DeltaTime to break FPS addiction WaveForce *= DeltaTime; // Apply actor scale WaveForce *= OwnerScale.X;// *OwnerScale.Y * OwnerScale.Z; OldPrimitive->AddForceAtLocation(WaveForce * Mass, TensionDotWorld); } // Static metacentric forces (can be useful on small waves) if (bUseMetacentricForces) { FVector TensionTorqueResult = FVector(0.0f, 0.0f, 0.0f); // Calc recovering torque (transverce) FRotator RollRot = FRotator(0.0f, 0.0f, 0.0f); RollRot.Roll = OldRotation.Roll; FVector MetacenterDisplaced = RollRot.RotateVector(TransverseMetacenter + COMOffset); TensionTorqueResult += X * FVector::DotProduct((TransverseMetacenter - MetacenterDisplaced), FVector(0.0f, -1.0f, 0.0f)) * TensionTorqueRollFactor; // Calc recovering torque (longitude) FRotator PitchRot = FRotator(0.0f, 0.0f, 0.0f); PitchRot.Pitch = OldRotation.Pitch; MetacenterDisplaced = PitchRot.RotateVector(LongitudinalMetacenter + COMOffset); TensionTorqueResult += Y * FVector::DotProduct((LongitudinalMetacenter - MetacenterDisplaced), FVector(1.0f, 0.0f, 0.0f)) * TensionTorquePitchFactor; // Apply torque TensionTorqueResult *= DeltaTime; TensionTorqueResult *= OwnerScale.X;// *OwnerScale.Y * OwnerScale.Z; OldPrimitive->AddTorque(TensionTorqueResult); } }