Esempio n. 1
0
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);
	}
}
Esempio n. 2
0
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();
}
Esempio n. 3
0
void DTransformPosition::OnTypeScreen() 
{
	UpdateData(1);

	if (!m_handler) return;

	m_handler->SetMapMode(m_type);
	m_handler->SetAxes(GetAxes());
	
}
Esempio n. 4
0
void DTransformPosition::OnControlClicked(UINT ctrl) 
{
	UpdateData(1);

	if (!m_handler) return;

	m_handler->SetMapMode(m_type);
	m_handler->SetAxes(GetAxes());
	
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
// 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);

}
Esempio n. 7
0
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();
}
Esempio n. 8
0
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();

}
Esempio n. 9
0
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);
	}
}