/* Crafter®.Graphics Copyright (C) 2025 Catcrafts® Catcrafts.net This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3.0 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ module; #include #include "VulkanBuffer.h" #include #include #include module Crafter.Graphics; import Crafter.Math; import Crafter.Event; using namespace Crafter; Camera::Camera(float fov, float aspectRatio, float near, float far) { projection = MatrixRowMajor::Perspective(fov, aspectRatio, near, far); view = MatrixRowMajor::Identity(); } void Camera::Update() { projectionView = projection*view; onUpdate.Invoke(); } Vector Camera::ToRay(uint32_t x, uint32_t y) { // // Normalize the screen coordinates // float mx = (2.0f * x) / sizeX - 1.0f; // float my = 1.0f - (2.0f * y) / sizeY; // // // Construct Ray in Homogeneous Clip Space // Vector rayOrigin = Vector(mx, my, 0.0f); // Vector rayEnd = Vector(mx, my, 1.0f); // // // Transform Ray to View Space // MatrixRowMajor invProjection = DirectX::XMMatrixInverse(NULL, projectionMatrix); // Vector rayOriginView = DirectX::XMVector3TransformCoord(rayOrigin, invProjection); // Vector rayEndView = DirectX::XMVector3TransformCoord(rayEnd, invProjection); // // // Transform Ray to World Space // DirectX::XMMATRIX viewMatrix = GetViewMatrix(); // Assuming this returns the view matrix // DirectX::XMMATRIX invView = DirectX::XMMatrixInverse(NULL, viewMatrix); // Vector rayOriginWorld = DirectX::XMVector3TransformCoord(rayOriginView, invView); // Vector rayEndWorld = DirectX::XMVector3TransformCoord(rayEndView, invView); // // // Compute Ray Direction // DirectX::XMVECTOR rayDirWorld = DirectX::XMVector3Normalize(DirectX::XMVectorSubtract(rayEndWorld, rayOriginWorld)); // // return rayDirWorld; return Vector(0,0,0); }