Works, but with memory leaks
This commit is contained in:
@@ -14,6 +14,7 @@ CameraActor::CameraActor()
|
||||
cameraComponent->aspectRatio = 1.777778f;
|
||||
cameraComponent->setParent(sceneComponent);
|
||||
cameraComponent->setOwner(this);
|
||||
sceneComponent->addChildComponent(cameraComponent);
|
||||
}
|
||||
|
||||
CameraActor::~CameraActor()
|
||||
|
||||
@@ -13,8 +13,8 @@ CameraComponent::CameraComponent()
|
||||
, projectionMatrix(Matrix4())
|
||||
, viewMatrix(Matrix4())
|
||||
{
|
||||
rotationX = 0;
|
||||
rotationY = 0;
|
||||
yaw = 0;
|
||||
pitch = 0;
|
||||
setRelativeLocation(Vector(0, 10, -50));
|
||||
}
|
||||
|
||||
@@ -22,12 +22,16 @@ CameraComponent::~CameraComponent()
|
||||
{
|
||||
}
|
||||
|
||||
void CameraComponent::mouseMove(float deltaX, float deltaY)
|
||||
void CameraComponent::mouseMove(float deltaYaw, float deltaPitch)
|
||||
{
|
||||
rotationX -= deltaX / 1000.f;
|
||||
rotationY += deltaY / 1000.f;
|
||||
//std::cout << "X:" << rotationX << " Y: " << rotationY << std::endl;
|
||||
setRelativeRotation(Vector(rotationY, rotationX, 0));
|
||||
yaw -= deltaYaw / 500.f;
|
||||
pitch += deltaPitch / 500.f;
|
||||
//std::cout << "Yaw: " << yaw << " Pitch: " << pitch << std::endl;
|
||||
Vector cameraDirection = glm::normalize(Vector(cos(yaw) * cos(pitch), sin(pitch), sin(yaw) * cos(pitch)));
|
||||
Vector xyz = glm::cross(cameraDirection, Vector(0, 0, 1));
|
||||
Quaternion result = Quaternion(glm::dot(cameraDirection, Vector(0, 0, 1)) + 1, xyz.x, xyz.y, xyz.z);
|
||||
//std::cout << "Result " << Vector(0, 0, 1) * glm::normalize(result) << " cameraDirection: " << cameraDirection << std::endl;
|
||||
setRelativeRotation(result);
|
||||
bNeedsViewBuild = true;
|
||||
}
|
||||
|
||||
@@ -51,9 +55,9 @@ void CameraComponent::moveY(float amount)
|
||||
|
||||
void CameraComponent::buildViewMatrix()
|
||||
{
|
||||
Vector eyePos = getTransform().getPosition();
|
||||
Vector lookAt = eyePos + getTransform().getForward();
|
||||
std::cout << "Eye: " << eyePos << " lookAt: " << lookAt << std::endl;
|
||||
Vector eyePos = getAbsoluteTransform().getPosition();
|
||||
Vector lookAt = eyePos + glm::normalize(Vector(cos(yaw) * cos(pitch), sin(pitch), sin(yaw) * cos(pitch)));
|
||||
//std::cout << "Eye: " << eyePos << " lookAt: " << lookAt << std::endl;
|
||||
viewMatrix = glm::lookAt(eyePos, lookAt, Vector(0, 1, 0));
|
||||
|
||||
bNeedsViewBuild = false;
|
||||
|
||||
@@ -45,8 +45,8 @@ private:
|
||||
//Transforms relative to actor
|
||||
Matrix4 viewMatrix;
|
||||
Matrix4 projectionMatrix;
|
||||
float rotationX;
|
||||
float rotationY;
|
||||
float yaw;
|
||||
float pitch;
|
||||
};
|
||||
DEFINE_REF(CameraComponent)
|
||||
} // namespace Seele
|
||||
|
||||
@@ -128,18 +128,22 @@ void Component::notifySceneAttach(PScene scene)
|
||||
void Component::setRelativeLocation(Vector location)
|
||||
{
|
||||
transform = Transform(location, transform.getRotation(), transform.getScale());
|
||||
propagateTransformUpdate();
|
||||
}
|
||||
void Component::setRelativeRotation(Vector rotation)
|
||||
{
|
||||
transform = Transform(transform.getPosition(), Quaternion(rotation), transform.getScale());
|
||||
propagateTransformUpdate();
|
||||
}
|
||||
void Component::setRelativeRotation(Quaternion rotation)
|
||||
{
|
||||
transform = Transform(transform.getPosition(), rotation, transform.getScale());
|
||||
propagateTransformUpdate();
|
||||
}
|
||||
void Component::setRelativeScale(Vector scale)
|
||||
{
|
||||
transform = Transform(transform.getPosition(), transform.getRotation(), scale);
|
||||
propagateTransformUpdate();
|
||||
}
|
||||
|
||||
//void Component::addAbsoluteTranslation(Vector translation)
|
||||
@@ -161,14 +165,17 @@ void Component::setRelativeScale(Vector scale)
|
||||
void Component::addRelativeLocation(Vector translation)
|
||||
{
|
||||
transform = Transform(transform.getPosition() + translation, transform.getRotation(), transform.getScale());
|
||||
propagateTransformUpdate();
|
||||
}
|
||||
void Component::addRelativeRotation(Vector rotation)
|
||||
{
|
||||
transform = Transform(transform.getPosition(), transform.getRotation() + Quaternion(rotation), transform.getScale());
|
||||
transform = Transform(transform.getPosition(), transform.getRotation() * Quaternion(rotation), transform.getScale());
|
||||
propagateTransformUpdate();
|
||||
}
|
||||
void Component::addRelativeRotation(Quaternion rotation)
|
||||
{
|
||||
transform = Transform(transform.getPosition(), transform.getRotation(), transform.getScale());
|
||||
transform = Transform(transform.getPosition(), transform.getRotation() * rotation, transform.getScale());
|
||||
propagateTransformUpdate();
|
||||
}
|
||||
|
||||
Transform Component::getTransform() const
|
||||
@@ -177,10 +184,22 @@ Transform Component::getTransform() const
|
||||
}
|
||||
|
||||
Transform Component::getAbsoluteTransform() const
|
||||
{
|
||||
return absoluteTransform;
|
||||
}
|
||||
|
||||
void Component::propagateTransformUpdate()
|
||||
{
|
||||
if(parent != nullptr)
|
||||
{
|
||||
return transform + parent->getAbsoluteTransform();
|
||||
absoluteTransform = transform + parent->getAbsoluteTransform();
|
||||
}
|
||||
else
|
||||
{
|
||||
absoluteTransform = transform;
|
||||
}
|
||||
for(auto child : children)
|
||||
{
|
||||
child->propagateTransformUpdate();
|
||||
}
|
||||
return transform;
|
||||
}
|
||||
@@ -74,7 +74,9 @@ private:
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
void propagateTransformUpdate();
|
||||
Transform transform;
|
||||
Transform absoluteTransform;
|
||||
PScene owningScene;
|
||||
PActor owner;
|
||||
PComponent parent;
|
||||
|
||||
Reference in New Issue
Block a user