mirror of
https://github.com/whoahq/whoa.git
synced 2026-03-18 13:41:06 +03:00
Compare commits
13 Commits
fd28c55be8
...
8bd4e08c80
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8bd4e08c80 | ||
|
|
7d491570e4 | ||
|
|
2711c752ba | ||
|
|
0e6f65f32e | ||
|
|
86084516cd | ||
|
|
8935c520c0 | ||
|
|
7cf7127810 | ||
|
|
8fb51991e0 | ||
|
|
7fdd22545f | ||
|
|
15eafe92d7 | ||
|
|
1ad3679f90 | ||
|
|
81970958a8 | ||
|
|
a9cad5238d |
@ -1 +1 @@
|
|||||||
Subproject commit 1c9e7831c874068e7c939a7dea8790eef6513d78
|
Subproject commit dc8f10e407daa8bdf7e90d9438b55d5883780825
|
||||||
@ -32,6 +32,8 @@ if(WHOA_SYSTEM_MAC)
|
|||||||
"-framework AppKit"
|
"-framework AppKit"
|
||||||
"-framework Carbon"
|
"-framework Carbon"
|
||||||
"-framework IOKit"
|
"-framework IOKit"
|
||||||
|
"-framework Metal"
|
||||||
|
"-framework QuartzCore"
|
||||||
)
|
)
|
||||||
|
|
||||||
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/mac/MainMenu.nib DESTINATION "bin")
|
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/mac/MainMenu.nib DESTINATION "bin")
|
||||||
|
|||||||
9
src/app/mac/EngineMTLLayerView.h
Normal file
9
src/app/mac/EngineMTLLayerView.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#ifndef APP_MAC_ENGINE_MTL_LAYER_VIEW_H
|
||||||
|
#define APP_MAC_ENGINE_MTL_LAYER_VIEW_H
|
||||||
|
|
||||||
|
#include "app/mac/EngineGLLayerView.h"
|
||||||
|
|
||||||
|
@interface EngineMTLLayerView : EngineGLLayerView
|
||||||
|
@end
|
||||||
|
|
||||||
|
#endif
|
||||||
36
src/app/mac/EngineMTLLayerView.mm
Normal file
36
src/app/mac/EngineMTLLayerView.mm
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#include "app/mac/EngineMTLLayerView.h"
|
||||||
|
#import <QuartzCore/CAMetalLayer.h>
|
||||||
|
|
||||||
|
@implementation EngineMTLLayerView
|
||||||
|
|
||||||
|
- (CALayer*)makeBackingLayer {
|
||||||
|
return [CAMetalLayer layer];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)initWithFrame:(NSRect)frame glWindow:(GLWindow*)window {
|
||||||
|
self = [super initWithFrame:frame glWindow:window];
|
||||||
|
|
||||||
|
if (self) {
|
||||||
|
[self setWantsLayer:YES];
|
||||||
|
}
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)drawRect:(NSRect)dirtyRect {
|
||||||
|
// Rendering is driven by CGxDeviceMTL.
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)update {
|
||||||
|
[super update];
|
||||||
|
|
||||||
|
if (![self.layer isKindOfClass:[CAMetalLayer class]]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
CAMetalLayer* layer = (CAMetalLayer*)self.layer;
|
||||||
|
CGSize size = [self convertSizeToBacking:self.bounds.size];
|
||||||
|
layer.drawableSize = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@ -1,7 +1,9 @@
|
|||||||
#include "app/mac/View.h"
|
#include "app/mac/View.h"
|
||||||
#include "app/mac/EngineGLLayerView.h"
|
#include "app/mac/EngineGLLayerView.h"
|
||||||
|
#include "app/mac/EngineMTLLayerView.h"
|
||||||
#include "app/mac/WindowCallbacks.h"
|
#include "app/mac/WindowCallbacks.h"
|
||||||
#include "gx/gll/GLWindow.h"
|
#include "gx/gll/GLWindow.h"
|
||||||
|
#include "gx/Device.hpp"
|
||||||
|
|
||||||
GLWindowCallbacks EngineViewCallbacks = {
|
GLWindowCallbacks EngineViewCallbacks = {
|
||||||
&MacOnResized,
|
&MacOnResized,
|
||||||
@ -23,5 +25,9 @@ void AssignEngineViewCallbacks(GLWindowCallbacks* callbacks) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Class GetEngineViewClass() {
|
Class GetEngineViewClass() {
|
||||||
|
if (GxDevApi() == GxApi_Metal) {
|
||||||
|
return [EngineMTLLayerView class];
|
||||||
|
}
|
||||||
|
|
||||||
return [EngineGLLayerView class];
|
return [EngineGLLayerView class];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,6 +2,7 @@
|
|||||||
#include "app/mac/MacClient.h"
|
#include "app/mac/MacClient.h"
|
||||||
#include "event/Input.hpp"
|
#include "event/Input.hpp"
|
||||||
#include "gx/gll/CGxDeviceGLL.hpp"
|
#include "gx/gll/CGxDeviceGLL.hpp"
|
||||||
|
#include "gx/mtl/CGxDeviceMTL.hpp"
|
||||||
#include "gx/Device.hpp"
|
#include "gx/Device.hpp"
|
||||||
#include "gx/Window.hpp"
|
#include "gx/Window.hpp"
|
||||||
#include <bc/Debug.hpp>
|
#include <bc/Debug.hpp>
|
||||||
@ -171,7 +172,11 @@ void MacOnResized(int32_t width, int32_t height, bool a3) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (GxDevApi() == GxApi_GLL) {
|
||||||
static_cast<CGxDeviceGLL*>(g_theGxDevicePtr)->Resize(width, height);
|
static_cast<CGxDeviceGLL*>(g_theGxDevicePtr)->Resize(width, height);
|
||||||
|
} else if (GxDevApi() == GxApi_Metal) {
|
||||||
|
static_cast<CGxDeviceMTL*>(g_theGxDevicePtr)->Resize(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
OsQueuePut(OS_INPUT_SIZE, width, height, 0, 0);
|
OsQueuePut(OS_INPUT_SIZE, width, height, 0, 0);
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
#include "gx/Adapter.hpp"
|
#include "gx/Adapter.hpp"
|
||||||
#include "gx/Device.hpp"
|
#include "gx/Device.hpp"
|
||||||
#include <storm/Array.hpp>
|
#include <storm/Array.hpp>
|
||||||
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
static CGxDevice* s_device;
|
static CGxDevice* s_device;
|
||||||
@ -417,6 +418,13 @@ void ConsoleDeviceInitialize(const char* title) {
|
|||||||
api = GxApi_GLL;
|
api = GxApi_GLL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(WHOA_SYSTEM_MAC)
|
||||||
|
const char* apiOverride = getenv("WHOA_GX_API");
|
||||||
|
if (apiOverride && !strcmp(apiOverride, "metal")) {
|
||||||
|
api = GxApi_Metal;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
s_device = GxDevCreate(api, OsWindowProc, format);
|
s_device = GxDevCreate(api, OsWindowProc, format);
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
|
|||||||
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#if defined(WHOA_SYSTEM_MAC)
|
#if defined(WHOA_SYSTEM_MAC)
|
||||||
#include "gx/gll/CGxDeviceGLL.hpp"
|
#include "gx/gll/CGxDeviceGLL.hpp"
|
||||||
|
#include "gx/mtl/CGxDeviceMTL.hpp"
|
||||||
#include "gx/mac/Display.hpp"
|
#include "gx/mac/Display.hpp"
|
||||||
#include <ApplicationServices/ApplicationServices.h>
|
#include <ApplicationServices/ApplicationServices.h>
|
||||||
#include <OpenGL/OpenGL.h>
|
#include <OpenGL/OpenGL.h>
|
||||||
@ -117,6 +118,8 @@ int32_t CGxDevice::AdapterFormats(EGxApi api, TSGrowableArray<CGxFormat>& adapte
|
|||||||
CGxDevice::OpenGlAdapterFormats(adapterFormats);
|
CGxDevice::OpenGlAdapterFormats(adapterFormats);
|
||||||
} else if (api == GxApi_GLL) {
|
} else if (api == GxApi_GLL) {
|
||||||
CGxDevice::GLLAdapterFormats(adapterFormats);
|
CGxDevice::GLLAdapterFormats(adapterFormats);
|
||||||
|
} else if (api == GxApi_Metal) {
|
||||||
|
CGxDevice::OpenGlAdapterFormats(adapterFormats);
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif defined(WHOA_SYSTEM_LINUX)
|
#elif defined(WHOA_SYSTEM_LINUX)
|
||||||
@ -228,6 +231,11 @@ CGxDevice* CGxDevice::NewGLL() {
|
|||||||
auto m = SMemAlloc(sizeof(CGxDeviceGLL), __FILE__, __LINE__, 0x0);
|
auto m = SMemAlloc(sizeof(CGxDeviceGLL), __FILE__, __LINE__, 0x0);
|
||||||
return new (m) CGxDeviceGLL();
|
return new (m) CGxDeviceGLL();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CGxDevice* CGxDevice::NewMTL() {
|
||||||
|
auto m = SMemAlloc(sizeof(CGxDeviceMTL), __FILE__, __LINE__, 0x0);
|
||||||
|
return new (m) CGxDeviceMTL();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CGxDevice* CGxDevice::NewOpenGl() {
|
CGxDevice* CGxDevice::NewOpenGl() {
|
||||||
|
|||||||
@ -70,6 +70,7 @@ class CGxDevice {
|
|||||||
#endif
|
#endif
|
||||||
#if defined(WHOA_SYSTEM_MAC)
|
#if defined(WHOA_SYSTEM_MAC)
|
||||||
static CGxDevice* NewGLL();
|
static CGxDevice* NewGLL();
|
||||||
|
static CGxDevice* NewMTL();
|
||||||
#endif
|
#endif
|
||||||
static CGxDevice* NewOpenGl();
|
static CGxDevice* NewOpenGl();
|
||||||
static void OpenGlAdapterFormats(TSGrowableArray<CGxFormat>& adapterFormats);
|
static void OpenGlAdapterFormats(TSGrowableArray<CGxFormat>& adapterFormats);
|
||||||
|
|||||||
@ -20,6 +20,7 @@ if(WHOA_SYSTEM_MAC)
|
|||||||
file(GLOB MAC_SOURCES
|
file(GLOB MAC_SOURCES
|
||||||
"gll/*.cpp"
|
"gll/*.cpp"
|
||||||
"gll/*.mm"
|
"gll/*.mm"
|
||||||
|
"mtl/*.mm"
|
||||||
"mac/*.cpp"
|
"mac/*.cpp"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -24,6 +24,8 @@ CGxDevice* GxDevCreate(EGxApi api, int32_t (*windowProc)(void* window, uint32_t
|
|||||||
device = CGxDevice::NewOpenGl();
|
device = CGxDevice::NewOpenGl();
|
||||||
} else if (api == GxApi_GLL) {
|
} else if (api == GxApi_GLL) {
|
||||||
device = CGxDevice::NewGLL();
|
device = CGxDevice::NewGLL();
|
||||||
|
} else if (api == GxApi_Metal) {
|
||||||
|
device = CGxDevice::NewMTL();
|
||||||
} else {
|
} else {
|
||||||
// Error
|
// Error
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,7 +35,8 @@ enum EGxApi {
|
|||||||
GxApi_D3d10 = 3,
|
GxApi_D3d10 = 3,
|
||||||
GxApi_D3d11 = 4,
|
GxApi_D3d11 = 4,
|
||||||
GxApi_GLL = 5,
|
GxApi_GLL = 5,
|
||||||
GxApis_Last = 6
|
GxApi_Metal = 6,
|
||||||
|
GxApis_Last = 7
|
||||||
};
|
};
|
||||||
|
|
||||||
enum EGxBlend {
|
enum EGxBlend {
|
||||||
|
|||||||
81
src/gx/mtl/CGxDeviceMTL.hpp
Normal file
81
src/gx/mtl/CGxDeviceMTL.hpp
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
#ifndef GX_MTL_C_GX_DEVICE_MTL_HPP
|
||||||
|
#define GX_MTL_C_GX_DEVICE_MTL_HPP
|
||||||
|
|
||||||
|
#include "gx/CGxDevice.hpp"
|
||||||
|
#include "gx/gll/GLWindow.h"
|
||||||
|
|
||||||
|
class CGxBatch;
|
||||||
|
class CGxShader;
|
||||||
|
|
||||||
|
class CGxDeviceMTL : public CGxDevice {
|
||||||
|
public:
|
||||||
|
// Member variables
|
||||||
|
GLWindow m_window;
|
||||||
|
|
||||||
|
// Virtual member functions
|
||||||
|
void ITexMarkAsUpdated(CGxTex*) override;
|
||||||
|
void IRsSendToHw(EGxRenderState) override;
|
||||||
|
int32_t DeviceCreate(int32_t (*windowProc)(void* window, uint32_t message, uintptr_t wparam, intptr_t lparam), const CGxFormat&) override;
|
||||||
|
int32_t DeviceSetFormat(const CGxFormat&) override;
|
||||||
|
void* DeviceWindow() override;
|
||||||
|
void DeviceWM(EGxWM wm, uintptr_t param1, uintptr_t param2) override {};
|
||||||
|
void CapsWindowSize(CRect&) override;
|
||||||
|
void CapsWindowSizeInScreenCoords(CRect& dst) override;
|
||||||
|
void ScenePresent() override;
|
||||||
|
void SceneClear(uint32_t, CImVector) override;
|
||||||
|
void Draw(CGxBatch* batch, int32_t indexed) override;
|
||||||
|
void PoolSizeSet(CGxPool*, uint32_t) override;
|
||||||
|
char* BufLock(CGxBuf*) override;
|
||||||
|
int32_t BufUnlock(CGxBuf*, uint32_t) override;
|
||||||
|
void BufData(CGxBuf* buf, const void* data, size_t size, uintptr_t offset) override;
|
||||||
|
void TexDestroy(CGxTex* texId) override;
|
||||||
|
void IShaderCreate(CGxShader*) override;
|
||||||
|
void ShaderCreate(CGxShader*[], EGxShTarget, const char*, const char*, int32_t) override;
|
||||||
|
int32_t StereoEnabled(void) override;
|
||||||
|
void XformSetProjection(const C44Matrix& matrix) override;
|
||||||
|
|
||||||
|
// Member functions
|
||||||
|
CGxDeviceMTL();
|
||||||
|
void Resize(uint32_t width, uint32_t height);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void ISetCaps(const CGxFormat& format);
|
||||||
|
void EnsureLibrary();
|
||||||
|
void BeginFrame();
|
||||||
|
void* GetPipeline(EGxVertexBufferFormat format, bool useColor, bool useSkin, bool useTex, int32_t blendMode);
|
||||||
|
void* GetPoolBuffer(CGxPool* pool);
|
||||||
|
void ITexCreate(CGxTex* texId);
|
||||||
|
void ITexUpload(CGxTex* texId);
|
||||||
|
void* GetTexture(CGxTex* texId);
|
||||||
|
void* GetSampler(CGxTex* texId);
|
||||||
|
void EnsureFallbackTexture();
|
||||||
|
void EnsureDepthTexture(uint32_t width, uint32_t height);
|
||||||
|
void* GetDepthState(bool depthTest, bool depthWrite, uint32_t depthFunc);
|
||||||
|
void* m_device = nullptr;
|
||||||
|
void* m_commandQueue = nullptr;
|
||||||
|
void* m_layer = nullptr;
|
||||||
|
void* m_shaderLibrary = nullptr;
|
||||||
|
void* m_pipelineColor[GxVertexBufferFormats_Last][GxBlends_Last] = {};
|
||||||
|
void* m_pipelineSolid[GxVertexBufferFormats_Last][GxBlends_Last] = {};
|
||||||
|
void* m_pipelineSkin[GxVertexBufferFormats_Last][GxBlends_Last] = {};
|
||||||
|
void* m_pipelineColorTex[GxVertexBufferFormats_Last][GxBlends_Last] = {};
|
||||||
|
void* m_pipelineSolidTex[GxVertexBufferFormats_Last][GxBlends_Last] = {};
|
||||||
|
void* m_pipelineSkinTex[GxVertexBufferFormats_Last][GxBlends_Last] = {};
|
||||||
|
void* m_pipelineColorTex2[GxVertexBufferFormats_Last][GxBlends_Last] = {};
|
||||||
|
void* m_pipelineSolidTex2[GxVertexBufferFormats_Last][GxBlends_Last] = {};
|
||||||
|
void* m_pipelineSkinTex2[GxVertexBufferFormats_Last][GxBlends_Last] = {};
|
||||||
|
void* m_frameCommandBuffer = nullptr;
|
||||||
|
void* m_frameEncoder = nullptr;
|
||||||
|
void* m_frameDrawable = nullptr;
|
||||||
|
uint32_t m_frameHasDraw = 0;
|
||||||
|
uint32_t m_clearMask = 0;
|
||||||
|
uint32_t m_clearColor = 0;
|
||||||
|
void* m_fallbackTexture = nullptr;
|
||||||
|
void* m_fallbackSampler = nullptr;
|
||||||
|
void* m_depthTexture = nullptr;
|
||||||
|
uint32_t m_depthWidth = 0;
|
||||||
|
uint32_t m_depthHeight = 0;
|
||||||
|
void* m_depthStates[2][2][4] = {};
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
1855
src/gx/mtl/CGxDeviceMTL.mm
Normal file
1855
src/gx/mtl/CGxDeviceMTL.mm
Normal file
File diff suppressed because it is too large
Load Diff
112
src/ui/simple/CSimpleCamera.cpp
Normal file
112
src/ui/simple/CSimpleCamera.cpp
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
#include "ui/simple/CSimpleCamera.hpp"
|
||||||
|
#include "model/Model2.hpp"
|
||||||
|
#include <tempest/Math.hpp>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
void FaceDirection(const C3Vector& direction, C3Vector& xPrime, C3Vector& yPrime, C3Vector& zPrime) {
|
||||||
|
STORM_ASSERT(CMath::fnotequal(direction.SquaredMag(), 0.0f));
|
||||||
|
|
||||||
|
// Forward
|
||||||
|
xPrime = direction;
|
||||||
|
|
||||||
|
// Right
|
||||||
|
if (CMath::fequal(xPrime.SquaredMag(), 0.0f)) {
|
||||||
|
yPrime.x = 1.0f;
|
||||||
|
yPrime.y = 0.0f;
|
||||||
|
yPrime.z = 0.0f;
|
||||||
|
} else {
|
||||||
|
yPrime.x = -xPrime.y;
|
||||||
|
yPrime.y = xPrime.x;
|
||||||
|
yPrime.z = 0.0f;
|
||||||
|
|
||||||
|
CMath::normalize(yPrime.x, yPrime.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Up (Forward cross Right)
|
||||||
|
zPrime = C3Vector::Cross(xPrime, yPrime);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BuildBillboardMatrix(const C3Vector& direction, C33Matrix& rotation) {
|
||||||
|
C3Vector xPrime = {};
|
||||||
|
C3Vector yPrime = {};
|
||||||
|
C3Vector zPrime = {};
|
||||||
|
|
||||||
|
FaceDirection(direction, xPrime, yPrime, zPrime);
|
||||||
|
|
||||||
|
// Forward
|
||||||
|
rotation.a0 = xPrime.x;
|
||||||
|
rotation.a1 = xPrime.y;
|
||||||
|
rotation.a2 = xPrime.z;
|
||||||
|
|
||||||
|
// Right
|
||||||
|
rotation.b0 = yPrime.x;
|
||||||
|
rotation.b1 = yPrime.y;
|
||||||
|
rotation.b2 = yPrime.z;
|
||||||
|
|
||||||
|
// Up
|
||||||
|
rotation.c0 = zPrime.x;
|
||||||
|
rotation.c1 = zPrime.y;
|
||||||
|
rotation.c2 = zPrime.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
CSimpleCamera::CSimpleCamera(float nearZ, float farZ, float fov) {
|
||||||
|
this->m_scene = nullptr;
|
||||||
|
|
||||||
|
this->m_nearZ = nearZ;
|
||||||
|
this->m_farZ = farZ;
|
||||||
|
this->m_fov = fov;
|
||||||
|
this->m_aspect = 1.0f;
|
||||||
|
|
||||||
|
this->SetFacing(0.0f, 0.0f, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
float CSimpleCamera::FOV() {
|
||||||
|
return this->m_fov;
|
||||||
|
}
|
||||||
|
|
||||||
|
C3Vector CSimpleCamera::Forward() const {
|
||||||
|
return { this->m_facing.a0, this->m_facing.a1, this->m_facing.a2 };
|
||||||
|
}
|
||||||
|
|
||||||
|
CM2Scene* CSimpleCamera::GetScene() {
|
||||||
|
if (!this->m_scene) {
|
||||||
|
this->m_scene = M2CreateScene();
|
||||||
|
}
|
||||||
|
|
||||||
|
return this->m_scene;
|
||||||
|
}
|
||||||
|
|
||||||
|
C3Vector CSimpleCamera::Right() const {
|
||||||
|
return { this->m_facing.b0, this->m_facing.b1, this->m_facing.b2 };
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSimpleCamera::SetFacing(const C3Vector& forward) {
|
||||||
|
BuildBillboardMatrix(forward, this->m_facing);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSimpleCamera::SetFacing(const C3Vector& forward, const C3Vector& up) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSimpleCamera::SetFacing(float yaw, float pitch, float roll) {
|
||||||
|
this->m_facing.FromEulerAnglesZYX(yaw, pitch, roll);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSimpleCamera::SetFarZ(float farZ) {
|
||||||
|
this->m_farZ = farZ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSimpleCamera::SetFieldOfView(float fov) {
|
||||||
|
this->m_fov = fov;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSimpleCamera::SetNearZ(float nearZ) {
|
||||||
|
this->m_nearZ = nearZ;
|
||||||
|
}
|
||||||
|
|
||||||
|
C3Vector CSimpleCamera::Up() const {
|
||||||
|
return { this->m_facing.c0, this->m_facing.c1, this->m_facing.c2 };
|
||||||
|
}
|
||||||
38
src/ui/simple/CSimpleCamera.hpp
Normal file
38
src/ui/simple/CSimpleCamera.hpp
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#ifndef UI_SIMPLE_C_SIMPLE_CAMERA_HPP
|
||||||
|
#define UI_SIMPLE_C_SIMPLE_CAMERA_HPP
|
||||||
|
|
||||||
|
#include <tempest/Matrix.hpp>
|
||||||
|
#include <tempest/Vector.hpp>
|
||||||
|
|
||||||
|
class CM2Scene;
|
||||||
|
|
||||||
|
class CSimpleCamera {
|
||||||
|
public:
|
||||||
|
// Virtual public member functions
|
||||||
|
virtual float FOV();
|
||||||
|
virtual C3Vector Forward() const;
|
||||||
|
virtual C3Vector Right() const;
|
||||||
|
virtual C3Vector Up() const;
|
||||||
|
|
||||||
|
// Public member functions
|
||||||
|
CSimpleCamera(float nearZ, float farZ, float fov);
|
||||||
|
CM2Scene* GetScene();
|
||||||
|
void SetFacing(const C3Vector& forward);
|
||||||
|
void SetFacing(const C3Vector& forward, const C3Vector& up);
|
||||||
|
void SetFacing(float yaw, float pitch, float roll);
|
||||||
|
void SetFarZ(float farZ);
|
||||||
|
void SetFieldOfView(float fov);
|
||||||
|
void SetNearZ(float nearZ);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// Protected member variables
|
||||||
|
CM2Scene* m_scene;
|
||||||
|
C3Vector m_position;
|
||||||
|
C33Matrix m_facing;
|
||||||
|
float m_nearZ;
|
||||||
|
float m_farZ;
|
||||||
|
float m_fov;
|
||||||
|
float m_aspect;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -23,6 +23,8 @@ if(WHOA_SYSTEM_MAC)
|
|||||||
"-framework AppKit"
|
"-framework AppKit"
|
||||||
"-framework Carbon"
|
"-framework Carbon"
|
||||||
"-framework IOKit"
|
"-framework IOKit"
|
||||||
|
"-framework Metal"
|
||||||
|
"-framework QuartzCore"
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user