1 Commits

Author SHA256 Message Date
51a6ea1328 added core changes to dicon viewer branch 2026-03-26 18:51:29 +01:00
9 changed files with 413 additions and 443 deletions

View File

@@ -1,5 +1,2 @@
# TSE # TSE
packages needed for building under linux:
build-essential llvm cmake ninja-build clang mesa-common-dev gdb

View File

@@ -1,221 +1,239 @@
#include "Camera.hpp" #include "Camera.hpp"
#include "elements/Transformable.hpp" #include "elements/Transformable.hpp"
#include "interfaces/IRenderer.hpp" #include "interfaces/IRenderer.hpp"
#include "interfaces/IWindow.hpp" #include "uuid.h"
#include "uuid.h"
TSE::Camera* TSE::Camera::mainCamera = nullptr;
TSE::Camera* TSE::Camera::mainCamera = nullptr; TSE::ICameraHelper* TSE::Camera::helper = nullptr;
TSE::ICameraHelper* TSE::Camera::helper = nullptr;
float TSE::Camera::GetRenderScale() const
float TSE::Camera::GetRenderScale() const {
{ return RenderScale;
return RenderScale; }
}
TSE::ProjectionType TSE::Camera::GetProjection() const
TSE::ProjectionType TSE::Camera::GetProjection() const {
{ return projection;
return projection; }
}
float TSE::Camera::GetNearClippingPlane() const
float TSE::Camera::GetNearClippingPlane() const {
{ return nearClippingPlane;
return nearClippingPlane; }
}
float TSE::Camera::GetFarClippingPlane() const
float TSE::Camera::GetFarClippingPlane() const {
{ return farClippingPlane;
return farClippingPlane; }
}
float TSE::Camera::GetFov() const
float TSE::Camera::GetFov() const {
{ return fov;
return fov; }
}
const TSE::Vector2 &TSE::Camera::GetRenderTargetSize() const
const TSE::Vector2 &TSE::Camera::GetRenderTargetSize() const {
{ return lastRtSize;
return lastRtSize; }
}
TSE::Vector3 TSE::Camera::SceenPositionToGamePosition(Vector2 screenPos)
TSE::Vector3 TSE::Camera::SceenPositionToGamePosition(Vector2 screenPos) {
{ float x = 2.0f * screenPos.x / lastRtSize.x -1.0f;
float x = 2.0f * screenPos.x / lastRtSize.x -1.0f; float y = 1.0f - 2.0f * screenPos.y / lastRtSize.y;
float y = 1.0f - 2.0f * screenPos.y / lastRtSize.y; float z = -1.0f;
float z = -1.0f; Vector4 ndc(x,y,x,1);
Vector4 ndc(x,y,x,1);
Matrix4x4 InversProj = Matrix4x4(*projectionMatrix);
Matrix4x4 InversProj = Matrix4x4(*projectionMatrix); InversProj.Invert();
InversProj.Invert(); Vector4 camSpace = InversProj * ndc;
Vector4 camSpace = InversProj * ndc; camSpace = camSpace / camSpace.w;
camSpace = camSpace / camSpace.w; Vector3 relativPos(camSpace);
Vector3 relativPos(camSpace); relativPos.z = 0;
relativPos.z = 0; return baseObject->LocalToGlobalPosition(relativPos);
return baseObject->LocalToGlobalPosition(relativPos); }
}
void TSE::Camera::SetRenderScale(float v)
void TSE::Camera::SetRenderScale(float v) {
{ RenderScale = v; RecalculateProjMatrix();
RenderScale = v; RecalculateProjMatrix(); }
}
void TSE::Camera::SetProjection(ProjectionType v)
void TSE::Camera::SetProjection(ProjectionType v) {
{ projection = v; RecalculateProjMatrix();
projection = v; RecalculateProjMatrix(); }
}
void TSE::Camera::SetNearClippingPlane(float v)
void TSE::Camera::SetNearClippingPlane(float v) {
{ nearClippingPlane = v; RecalculateProjMatrix();
nearClippingPlane = v; RecalculateProjMatrix(); }
}
void TSE::Camera::SetFarClippingPlane(float v)
void TSE::Camera::SetFarClippingPlane(float v) {
{ farClippingPlane = v; RecalculateProjMatrix();
farClippingPlane = v; RecalculateProjMatrix(); }
}
void TSE::Camera::SetFov(float v)
void TSE::Camera::SetFov(float v) {
{ fov = v; RecalculateProjMatrix();
fov = v; RecalculateProjMatrix(); }
}
TSE::Camera::Camera()
TSE::Camera::Camera() {
{ }
}
TSE::Camera::~Camera()
TSE::Camera::~Camera() {
{ delete(projectionMatrix);
delete(projectionMatrix); if(mainCamera == this)
if(mainCamera == this) mainCamera = nullptr;
mainCamera = nullptr; }
}
void TSE::Camera::OnResize(float width, float height, IResizable *wnd)
void TSE::Camera::OnResize(float width, float height, IResizable *wnd) {
{ lastRtSize = {width, height};
lastRtSize = {width, height}; RecalculateProjMatrix();
RecalculateProjMatrix(); }
}
void TSE::Camera::SetRenderTarget(IRenderTarget *target)
void TSE::Camera::SetRenderTarget(IRenderTarget *target) {
{ if(rt != nullptr)
if(rt != nullptr) rt->RemoveResizeNotifiable(this);
rt->RemoveResizeNotifiable(this); if(target != nullptr)
if(target != nullptr) target->AddResizeNotifiable(this);
target->AddResizeNotifiable(this); rt = target;
rt = target; if(lastRtSize != rt->GetRawIResizableSize())
if(lastRtSize != rt->GetRawIResizableSize()) {
{ lastRtSize = rt->GetRawIResizableSize();
lastRtSize = rt->GetRawIResizableSize(); RecalculateProjMatrix();
RecalculateProjMatrix(); }
} }
}
TSE::IRenderTarget *TSE::Camera::GetRenderTarget()
TSE::IRenderTarget *TSE::Camera::GetRenderTarget() {
{ return rt;
return rt; }
}
void TSE::Camera::RecalculateProjMatrix()
void TSE::Camera::RecalculateProjMatrix() {
{ if(projectionMatrix)
if(projectionMatrix) delete(projectionMatrix);
delete(projectionMatrix);
if(projection == ProjectionType::Orthographic)
if(projection == ProjectionType::Orthographic) {
{ float x = lastRtSize.x / RenderScale;
float x = lastRtSize.x / RenderScale; float y = lastRtSize.y / RenderScale;
float y = lastRtSize.y / RenderScale; float mx = -x;
float mx = -x; float my = -y;
float my = -y; projectionMatrix = new Matrix4x4(Matrix4x4::Orthographic(mx, x, my, y, nearClippingPlane, farClippingPlane));
projectionMatrix = new Matrix4x4(Matrix4x4::Orthographic(mx, x, my, y, nearClippingPlane, farClippingPlane)); }
} else if(projection == ProjectionType::Perspective)
else if(projection == ProjectionType::Perspective) {
{ float x = lastRtSize.x / RenderScale;
float x = lastRtSize.x / RenderScale; float y = lastRtSize.y / RenderScale;
float y = lastRtSize.y / RenderScale;
float aspectRatio = x / y;
float aspectRatio = x / y;
projectionMatrix = new Matrix4x4(Matrix4x4::Perspective(fov, aspectRatio, nearClippingPlane, farClippingPlane));
projectionMatrix = new Matrix4x4(Matrix4x4::Perspective(fov, aspectRatio, nearClippingPlane, farClippingPlane)); }
} }
}
void TSE::Camera::OnUpdate()
void TSE::Camera::OnUpdate() {
{ if(mainCamera == nullptr && baseObject->name != ".EditorCamera")
if(mainCamera == nullptr && baseObject->name != ".EditorCamera") {
{ mainCamera = this;
mainCamera = this; }
}
if(rt != nullptr)
if(rt != nullptr) IRenderer::camerasToRenderWith.push_back(this);
IRenderer::camerasToRenderWith.push_back(this); }
}
void TSE::Camera::Start()
void TSE::Camera::Start() {
{ if(mainCamera == nullptr && baseObject->name != ".EditorCamera")
if(mainCamera == nullptr && baseObject->name != ".EditorCamera") {
{ mainCamera = this;
mainCamera = this; }
} }
}
TSE::Matrix4x4 BuildView_Zplus_RH(const TSE::Matrix4x4& world)
TSE::Matrix4x4 BuildView_Zplus_RH(const TSE::Matrix4x4& world) {
{ using namespace TSE;
using namespace TSE; // Welt-Position (w=1)
// Welt-Position (w=1) Vector3 pos = Vector3(world * Vector4(0,0,0,1));
Vector3 pos = Vector3(world * Vector4(0,0,0,1));
// Richtungsachsen in Welt (w=0, KEINE Translation!)
// Richtungsachsen in Welt (w=0, KEINE Translation!) Vector3 fwdWS = Vector3(world * Vector4(0,0,1,0)); // +Z vorwärts in Welt
Vector3 fwdWS = Vector3(world * Vector4(0,0,1,0)); // +Z vorwärts in Welt Vector3 upWS = Vector3(world * Vector4(0,1,0,0)); // +Y oben in Welt
Vector3 upWS = Vector3(world * Vector4(0,1,0,0)); // +Y oben in Welt
// Orthonormale Basis aufbauen (X+ soll "right" sein)
// Orthonormale Basis aufbauen (X+ soll "right" sein) Vector3 f = Vector3::Normalize(fwdWS);
Vector3 f = Vector3::Normalize(fwdWS); Vector3 r = Vector3::Normalize(Vector3::Cross(upWS, f)); // right = up × forward => (+1,0,0) im Identity-Fall
Vector3 r = Vector3::Normalize(Vector3::Cross(upWS, f)); // right = up × forward => (+1,0,0) im Identity-Fall Vector3 u = Vector3::Cross(f, r); // re-orthonormalisiertes up
Vector3 u = Vector3::Cross(f, r); // re-orthonormalisiertes up
Matrix4x4 view(1.0f); // Identität als Basis
Matrix4x4 view(1.0f); // Identität als Basis
// Row-major befüllen (Zeilen = r,u,-f), letzte Spalte = -dot(row, pos) bzw. +dot(f,pos)
// Row-major befüllen (Zeilen = r,u,-f), letzte Spalte = -dot(row, pos) bzw. +dot(f,pos) view.m[0][0] = r.x; view.m[0][1] = r.y; view.m[0][2] = r.z; view.m[0][3] = -Vector3::Dot(r, pos);
view.m[0][0] = r.x; view.m[0][1] = r.y; view.m[0][2] = r.z; view.m[0][3] = -Vector3::Dot(r, pos); view.m[1][0] = u.x; view.m[1][1] = u.y; view.m[1][2] = u.z; view.m[1][3] = -Vector3::Dot(u, pos);
view.m[1][0] = u.x; view.m[1][1] = u.y; view.m[1][2] = u.z; view.m[1][3] = -Vector3::Dot(u, pos); view.m[2][0] = -f.x; view.m[2][1] = -f.y; view.m[2][2] = -f.z; view.m[2][3] = Vector3::Dot(f, pos);
view.m[2][0] = -f.x; view.m[2][1] = -f.y; view.m[2][2] = -f.z; view.m[2][3] = Vector3::Dot(f, pos); view.m[3][0] = 0.0f; view.m[3][1] = 0.0f; view.m[3][2] = 0.0f; view.m[3][3] = 1.0f;
view.m[3][0] = 0.0f; view.m[3][1] = 0.0f; view.m[3][2] = 0.0f; view.m[3][3] = 1.0f;
return view;
return view; }
}
void TSE::Camera::PreDraw(IShader *shader)
void TSE::Camera::PreDraw(IShader *shader) {
{ rt->Bind();
rt->Bind(); // shader->SetUniform("prMatrix", projectionMatrix);
shader->SetUniform("prMatrix", projectionMatrix);
// auto worlmatrix = baseObject->GetGlobalMatrix();
auto worlmatrix = baseObject->GetGlobalMatrix();
// viewMatrix = BuildView_Zplus_RH(worlmatrix);
viewMatrix = BuildView_Zplus_RH(worlmatrix);
// shader->SetUniform("camMatrix", &viewMatrix);
shader->SetUniform("camMatrix", &viewMatrix); // helper->OnRenderTargetChanged(lastRtSize.x, lastRtSize.y);
helper->OnRenderTargetChanged(lastRtSize.x, lastRtSize.y);
} Vector3 pos = baseObject->GetGlobalPosition();
Vector3 right = baseObject->LocalToGlobalPosition(Vector3::right) - pos;
void TSE::Camera::PostDraw() Vector3 up = baseObject->LocalToGlobalPosition(Vector3::up) - pos;
{ Vector3 forward = baseObject->LocalToGlobalPosition(Vector3::forward) - pos;
rt->Unbind(); forward.Normalize();
}
shader->SetUniform("CamPos", &pos);
void TSE::Camera::Bind() shader->SetUniform("CamRight", &right);
{ shader->SetUniform("CamUp", &up);
rt->Bind(); shader->SetUniform("CamForward", &forward);
}
float x = lastRtSize.x / RenderScale;
void TSE::Camera::Unbind() float y = lastRtSize.y / RenderScale;
{ float mx = -x;
rt->Unbind(); float my = -y;
} shader->SetUniform("OrthoLeft", mx);
shader->SetUniform("OrthoRight", x);
void TSE::Camera::UpdateRenderTarget() shader->SetUniform("OrthoBottom", my);
{ shader->SetUniform("OrthoTop", y);
if (dynamic_cast<IWindow*>(rt) == nullptr) shader->SetUniform("NearPlane", nearClippingPlane);
{ shader->SetUniform("FarPlane", farClippingPlane);
rt->Update(); }
}
} void TSE::Camera::PostDraw()
{
rt->Unbind();
}
void TSE::Camera::Bind()
{
rt->Bind();
}
void TSE::Camera::Unbind()
{
rt->Unbind();
}
void TSE::Camera::UpdateRenderTarget()
{
rt->Update();
}

View File

@@ -1,8 +1,6 @@
#include "OrdererSpriteSet.hpp" #include "OrdererSpriteSet.hpp"
#include <algorithm> #include <algorithm>
#include <tuple> #include <tuple>
#include <cmath>
#include "Debug.hpp"
TSE::OrdererSpriteSetChunk::OrdererSpriteSetChunk(int _chunksize, const Vector2 &_pos, SortingOrder _order) TSE::OrdererSpriteSetChunk::OrdererSpriteSetChunk(int _chunksize, const Vector2 &_pos, SortingOrder _order)
{ {
@@ -146,8 +144,6 @@ void TSE::OrdererSpriteSet::SetSprite(Vector2 p, Vector2 Spriteindex, float heig
{ {
Vector2 chunkInnerPos = LocalToChunkPos(p); Vector2 chunkInnerPos = LocalToChunkPos(p);
Vector2 chunkIndex = p - chunkInnerPos; Vector2 chunkIndex = p - chunkInnerPos;
// Vector2 p2 = Vector2((int)p.x % chunkSize, (int)p.y % chunkSize);
// Vector2 chunkIndex = p - p2;
if(!chunks.contains(chunkIndex)) if(!chunks.contains(chunkIndex))
{ {
dirty = true; dirty = true;
@@ -179,9 +175,7 @@ const std::vector<TSE::Vector2> *TSE::OrdererSpriteSet::GetChunkPositionsInOrder
case TopLeft: case TopLeft:
std::sort(orderedChunks.begin(), orderedChunks.end(), [](const Vector2& a, const Vector2& b) std::sort(orderedChunks.begin(), orderedChunks.end(), [](const Vector2& a, const Vector2& b)
{ {
if (a.y != b.y) return std::tie(a.y, a.x) > std::tie(b.y, b.x);
return a.y > b.y;
return a.x < b.x;
}); });
break; break;
case TopRight: case TopRight:
@@ -195,9 +189,7 @@ const std::vector<TSE::Vector2> *TSE::OrdererSpriteSet::GetChunkPositionsInOrder
case BottomLeft: case BottomLeft:
std::sort(orderedChunks.begin(), orderedChunks.end(), [](const Vector2& a, const Vector2& b) std::sort(orderedChunks.begin(), orderedChunks.end(), [](const Vector2& a, const Vector2& b)
{ {
if (a.y != b.y) return std::tie(a.y, a.x) < std::tie(b.y, b.x);
return a.y < b.y;
return a.x < b.x;
}); });
break; break;
case BottomRight: case BottomRight:
@@ -238,7 +230,7 @@ void TSE::OrdererSpriteSet::DirtyAll()
TSE::Vector2 TSE::OrdererSpriteSet::LocalToChunkPos(const Vector2 &v) TSE::Vector2 TSE::OrdererSpriteSet::LocalToChunkPos(const Vector2 &v)
{ {
Vector2 p = Vector2(std::fmod(v.x, chunkSize), std::fmod(v.y, chunkSize)); Vector2 p = Vector2((int)v.x % chunkSize, (int)v.y % chunkSize);
if(p.x < 0) p.x += chunkSize; if(p.x < 0) p.x += chunkSize;
if(p.y < 0) p.y += chunkSize; if(p.y < 0) p.y += chunkSize;
return p; return p;

View File

@@ -50,7 +50,7 @@ namespace TSE
Rect bounds = Rect(0,0,0,0); Rect bounds = Rect(0,0,0,0);
public: public:
float chunkSize = 16; int chunkSize = 16;
SortingOrder order = TopRight; SortingOrder order = TopRight;
TileSet* set; TileSet* set;
std::unordered_map<Vector2, OrdererSpriteSetChunk> chunks; std::unordered_map<Vector2, OrdererSpriteSetChunk> chunks;

View File

@@ -3,19 +3,15 @@
#include "BehaviourScriptRegistry.hpp" #include "BehaviourScriptRegistry.hpp"
#include "BehaviourScripts/AudioListener.hpp" #include "BehaviourScripts/AudioListener.hpp"
#include "BehaviourScripts/AudioSource.hpp" #include "BehaviourScripts/AudioSource.hpp"
#include "BehaviourScripts/TileMap.hpp"
#include "BehaviourScripts/OrdererSpriteSet.hpp"
#include "BehaviourScripts/PhysicsObject.hpp"
#include "BehaviourScripts/basicEditorCamera.hpp" #include "BehaviourScripts/basicEditorCamera.hpp"
TSE::EDITOR::EditorSubsystem::EditorSubsystem(ConsolView* cvp) : sv(nullptr), editorLayer("") TSE::EDITOR::EditorSubsystem::EditorSubsystem() : sv(nullptr), editorLayer("")
{ {
rt = IRenderTexture::factory->CreateTextureHeap({100,100}, 5); rt = IRenderTexture::factory->CreateTextureHeap({100,100}, 5);
sv = SceneView(rt); sv = SceneView(rt);
cv = cvp;
controller.AddGuiElement("Scene", &sv); controller.AddGuiElement("Scene", &sv);
controller.AddGuiElement("Consol", cv); controller.AddGuiElement("Consol", &cv);
controller.AddGuiElement("Hirearchie", &hv); controller.AddGuiElement("Hirearchie", &hv);
controller.AddGuiElement("Properties", &pv); controller.AddGuiElement("Properties", &pv);
controller.AddGuiElement("Debug", &dv); controller.AddGuiElement("Debug", &dv);
@@ -30,9 +26,6 @@ TSE::EDITOR::EditorSubsystem::EditorSubsystem(ConsolView* cvp) : sv(nullptr), ed
BehaviourScriptRegistry::RegisterBehaviourScript("Camera", []() -> BehaviourScript* {return new Camera();}); BehaviourScriptRegistry::RegisterBehaviourScript("Camera", []() -> BehaviourScript* {return new Camera();});
BehaviourScriptRegistry::RegisterBehaviourScript("Audio Listener", []() -> BehaviourScript* {return new AudioListener();}); BehaviourScriptRegistry::RegisterBehaviourScript("Audio Listener", []() -> BehaviourScript* {return new AudioListener();});
BehaviourScriptRegistry::RegisterBehaviourScript("Audio Source", []() -> BehaviourScript* {return new AudioSource();}); BehaviourScriptRegistry::RegisterBehaviourScript("Audio Source", []() -> BehaviourScript* {return new AudioSource();});
BehaviourScriptRegistry::RegisterBehaviourScript("Tile Map", []() -> BehaviourScript* {return new TileMap();});
BehaviourScriptRegistry::RegisterBehaviourScript("Orderer Sprite Set", []() -> BehaviourScript* {return new OrdererSpriteSet();});
BehaviourScriptRegistry::RegisterBehaviourScript("Physics Object", []() -> BehaviourScript* { return new PhysicsObject(BodyType::Dynamic, ColliderShape::Box, 1.0f, 0.3f, Vector3(1, 1, 0)); });
#pragma region camerastuff #pragma region camerastuff
@@ -50,4 +43,4 @@ TSE::EDITOR::EditorSubsystem::EditorSubsystem(ConsolView* cvp) : sv(nullptr), ed
editorLayer.SetNonVisual(true); editorLayer.SetNonVisual(true);
#pragma endregion #pragma endregion
} }

View File

@@ -15,7 +15,7 @@ namespace TSE::EDITOR
{ {
public: public:
ViewportController controller; ViewportController controller;
ConsolView* cv = nullptr; ConsolView cv;
DebugView dv; DebugView dv;
HirearchieView hv = HirearchieView(nullptr); HirearchieView hv = HirearchieView(nullptr);
PropertiesView pv; PropertiesView pv;
@@ -24,6 +24,6 @@ namespace TSE::EDITOR
SceneView sv; SceneView sv;
Layer editorLayer; Layer editorLayer;
EditorSubsystem(ConsolView* cvp); EditorSubsystem();
}; };
} // namespace TSE::EDITOR } // namespace TSE::EDITOR

View File

@@ -208,10 +208,6 @@ namespace TSE::EDITOR
{ {
Draw((TileMap*)element, debug); Draw((TileMap*)element, debug);
} }
else if (name == "Orderer Sprite Set")
{
Draw((OrdererSpriteSet*)element, debug);
}
else else
{ {
element->CustomDraw(debug); element->CustomDraw(debug);
@@ -919,30 +915,6 @@ namespace TSE::EDITOR
ImGui::TextDisabled(("Chunk Count: " + std::to_string(element->GetChunkCount())).c_str()); ImGui::TextDisabled(("Chunk Count: " + std::to_string(element->GetChunkCount())).c_str());
} }
} }
void ElementDrawer::Draw(OrdererSpriteSet *element, const bool &debug)
{
int orderIndex = static_cast<int>(element->order);
const char* orderItems[] = { "TopRight", "TopLeft", "BottomRight", "BottomLeft" };
if (ImGui::Combo("Order", &orderIndex, orderItems, IM_ARRAYSIZE(orderItems)))
{
element->order = static_cast<SortingOrder>(orderIndex);
for (auto& [_, chunk] : element->chunks)
{
chunk.SetOrdering(element->order);
}
element->DirtyAll();
}
ImGui::BeginDisabled();
ImGui::DragFloat("Chunk Size", &element->chunkSize, 1.0f);
ImGui::EndDisabled();
if (debug)
{
ImGui::Separator();
ImGui::TextDisabled(("Chunk Count: " + std::to_string(element->GetChunkCount())).c_str());
}
}
void ElementDrawer::DrawAudioClipCompact(AudioClip *element, const bool &debug, const std::string &label) void ElementDrawer::DrawAudioClipCompact(AudioClip *element, const bool &debug, const std::string &label)
{ {
float item_spacing = ImGui::GetStyle().ItemSpacing.x; float item_spacing = ImGui::GetStyle().ItemSpacing.x;

View File

@@ -14,7 +14,6 @@
#include "BehaviourScripts/AudioListener.hpp" #include "BehaviourScripts/AudioListener.hpp"
#include "BehaviourScripts/AudioSource.hpp" #include "BehaviourScripts/AudioSource.hpp"
#include "BehaviourScripts/TileMap.hpp" #include "BehaviourScripts/TileMap.hpp"
#include "BehaviourScripts/OrdererSpriteSet.hpp"
namespace TSE::EDITOR namespace TSE::EDITOR
{ {
@@ -82,7 +81,6 @@ namespace TSE::EDITOR
static void Draw(Camera* element, const bool& debug); static void Draw(Camera* element, const bool& debug);
static void Draw(ParticleSystem* element, const bool& debug); static void Draw(ParticleSystem* element, const bool& debug);
static void Draw(TileMap* element, const bool& debug); static void Draw(TileMap* element, const bool& debug);
static void Draw(OrdererSpriteSet* element, const bool& debug);
static void DrawAudioClipCompact(AudioClip* element, const bool& debug, const std::string& label); static void DrawAudioClipCompact(AudioClip* element, const bool& debug, const std::string& label);
static void DrawAudioClipNormal(AudioClip* element, const bool& debug, const std::string& label); static void DrawAudioClipNormal(AudioClip* element, const bool& debug, const std::string& label);

View File

@@ -1,165 +1,165 @@
#include "GL/gl3w.h" #include "GL/gl3w.h"
#include "GL/gl.h" #include "GL/gl.h"
#include "TextureHelperOpenGL.hpp" #include "TextureHelperOpenGL.hpp"
void TSE::OpenGL::TextureHelperOpenGL::Bind(const Texture *tex) void TSE::OpenGL::TextureHelperOpenGL::Bind(const Texture *tex)
{ {
glBindTexture(GL_TEXTURE_2D, tex->GetTextureId()); glBindTexture(GL_TEXTURE_2D, tex->GetTextureId());
} }
void TSE::OpenGL::TextureHelperOpenGL::UnBind(const Texture *tex) void TSE::OpenGL::TextureHelperOpenGL::UnBind(const Texture *tex)
{ {
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
} }
void TSE::OpenGL::TextureHelperOpenGL::Apply(Texture *tex) void TSE::OpenGL::TextureHelperOpenGL::Apply(Texture *tex)
{ {
glBindTexture(GL_TEXTURE_2D, tex->GetTextureId()); glBindTexture(GL_TEXTURE_2D, tex->GetTextureId());
if(tex->Chanels() == 1) if(tex->Chanels() == 1)
{ {
if (tex->bpp() == 8) if (tex->bpp() == 8)
glTexImage2D(GL_TEXTURE_2D, 0,GL_R8, tex->Width(), tex->Height(), 0, GL_RED, GL_UNSIGNED_BYTE, tex->GetImagePtr()); glTexImage2D(GL_TEXTURE_2D, 0,GL_R8, tex->Width(), tex->Height(), 0, GL_RED, GL_UNSIGNED_BYTE, tex->GetImagePtr());
if (tex->bpp() == 16) if (tex->bpp() == 16)
glTexImage2D(GL_TEXTURE_2D, 0, GL_R16I, tex->Width(), tex->Height(), 0, GL_RED, GL_SHORT, tex->GetImagePtr()); glTexImage2D(GL_TEXTURE_2D, 0, GL_R16I, tex->Width(), tex->Height(), 0, GL_RED, GL_SHORT, tex->GetImagePtr());
} }
if(tex->Chanels() == 3) if(tex->Chanels() == 3)
{ {
if(tex->bpp() == 24) if(tex->bpp() == 24)
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, tex->Width(), tex->Height(), 0, GL_BGR, GL_UNSIGNED_BYTE, tex->GetImagePtr()); glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, tex->Width(), tex->Height(), 0, GL_BGR, GL_UNSIGNED_BYTE, tex->GetImagePtr());
} }
else if(tex->Chanels() == 4) else if(tex->Chanels() == 4)
{ {
if(tex->bpp() == 32) if(tex->bpp() == 32)
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA, tex->Width(), tex->Height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, tex->GetImagePtr()); glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA, tex->Width(), tex->Height(), 0, GL_BGRA, GL_UNSIGNED_BYTE, tex->GetImagePtr());
if (tex->bpp() == 8) //need to decode it with bitwise operations in shader if (tex->bpp() == 8) //need to decode it with bitwise operations in shader
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA2, tex->Width(), tex->Height(), 0, GL_RED, GL_UNSIGNED_BYTE, tex->GetImagePtr()); glTexImage2D(GL_TEXTURE_2D, 0,GL_RGBA2, tex->Width(), tex->Height(), 0, GL_RED, GL_UNSIGNED_BYTE, tex->GetImagePtr());
} }
glGenerateMipmap(GL_TEXTURE_2D); glGenerateMipmap(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0); glBindTexture(GL_TEXTURE_2D, 0);
} }
void TSE::OpenGL::TextureHelperOpenGL::Regist(Texture *tex) void TSE::OpenGL::TextureHelperOpenGL::Regist(Texture *tex)
{ {
uint TextureID; uint TextureID;
glGenTextures(1, &TextureID); glGenTextures(1, &TextureID);
glBindTexture(GL_TEXTURE_2D, TextureID); glBindTexture(GL_TEXTURE_2D, TextureID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
tex->SetTextureId(TextureID); tex->SetTextureId(TextureID);
tex->Apply(); tex->Apply();
} }
void TSE::OpenGL::TextureHelperOpenGL::PlatromDestroy(Texture *tex) void TSE::OpenGL::TextureHelperOpenGL::PlatromDestroy(Texture *tex)
{ {
uint id = tex->GetTextureId(); uint id = tex->GetTextureId();
glDeleteTextures(1, &id); glDeleteTextures(1, &id);
} }
void TSE::OpenGL::TextureHelperOpenGL::Bind3D(const VolumeTexture3D *tex) void TSE::OpenGL::TextureHelperOpenGL::Bind3D(const VolumeTexture3D *tex)
{ {
glBindTexture(GL_TEXTURE_3D, tex->GetTextureId()); glBindTexture(GL_TEXTURE_3D, tex->GetTextureId());
} }
void TSE::OpenGL::TextureHelperOpenGL::UnBind3D(const VolumeTexture3D *tex) void TSE::OpenGL::TextureHelperOpenGL::UnBind3D(const VolumeTexture3D *tex)
{ {
glBindTexture(GL_TEXTURE_3D, 0); glBindTexture(GL_TEXTURE_3D, 0);
} }
void TSE::OpenGL::TextureHelperOpenGL::Apply3D(VolumeTexture3D *tex) void TSE::OpenGL::TextureHelperOpenGL::Apply3D(VolumeTexture3D *tex)
{ {
glBindTexture(GL_TEXTURE_3D, tex->GetTextureId()); glBindTexture(GL_TEXTURE_3D, tex->GetTextureId());
ushort internal,input,size; ushort internal,input,size;
if(tex->Chanels() == 1) if(tex->Chanels() == 1)
{ {
if (tex->bpp() == 8) if (tex->bpp() == 8)
{ {
internal = GL_R8; internal = GL_R8;
input = GL_RED; input = GL_RED;
size = GL_UNSIGNED_BYTE; size = GL_UNSIGNED_BYTE;
} }
if (tex->bpp() == 16) if (tex->bpp() == 16)
{ {
internal = GL_R16I; internal = GL_R16I;
input = GL_RED; input = GL_RED;
size = GL_SHORT; size = GL_SHORT;
} }
} }
if(tex->Chanels() == 3) if(tex->Chanels() == 3)
{ {
if(tex->bpp() == 24) if(tex->bpp() == 24)
{ {
internal = GL_RGB; internal = GL_RGB;
input = GL_BGR; input = GL_BGR;
size = GL_UNSIGNED_BYTE; size = GL_UNSIGNED_BYTE;
} }
} }
else if(tex->Chanels() == 4) else if(tex->Chanels() == 4)
{ {
if(tex->bpp() == 32) if(tex->bpp() == 32)
{ {
internal = GL_RGBA; internal = GL_R16;
input = GL_BGRA; input = GL_BGRA;
size = GL_UNSIGNED_BYTE; size = GL_UNSIGNED_BYTE;
} }
if (tex->bpp() == 8) //need to decode it with bitwise operations in shader if (tex->bpp() == 8) //need to decode it with bitwise operations in shader
{ {
internal = GL_RGBA2; internal = GL_RGBA2;
input = GL_RED; input = GL_RED;
size = GL_UNSIGNED_BYTE; size = GL_UNSIGNED_BYTE;
} }
} }
glTexImage3D(GL_TEXTURE_3D, 0, internal, tex->Width(), tex->Height(), tex->Depth(), 0, input, size, nullptr); glTexImage3D(GL_TEXTURE_3D, 0, internal, tex->Width(), tex->Height(), tex->Depth(), 0, input, size, nullptr);
for (int z = 0; z < tex->Depth(); ++z) for (int z = 0; z < tex->Depth(); ++z)
{ {
glTexSubImage3D( glTexSubImage3D(
GL_TEXTURE_3D, GL_TEXTURE_3D,
0, 0,
0, 0,
0, 0,
z, z,
tex->Width(), tex->Width(),
tex->Height(), tex->Height(),
1, 1,
input, input,
size, size,
tex->GetImagePtr(z) tex->GetImagePtr(z)
); );
} }
glGenerateMipmap(GL_TEXTURE_3D); //glGenerateMipmap(GL_TEXTURE_3D);
glBindTexture(GL_TEXTURE_3D, 0); glBindTexture(GL_TEXTURE_3D, 0);
} }
void TSE::OpenGL::TextureHelperOpenGL::Regist3D(VolumeTexture3D *tex) void TSE::OpenGL::TextureHelperOpenGL::Regist3D(VolumeTexture3D *tex)
{ {
uint TextureID; uint TextureID;
glGenTextures(1, &TextureID); glGenTextures(1, &TextureID);
glBindTexture(GL_TEXTURE_3D, TextureID); glBindTexture(GL_TEXTURE_3D, TextureID);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
tex->SetTextureId(TextureID); tex->SetTextureId(TextureID);
tex->Apply(); tex->Apply();
} }
void TSE::OpenGL::TextureHelperOpenGL::PlatromDestroy3D(VolumeTexture3D *tex) void TSE::OpenGL::TextureHelperOpenGL::PlatromDestroy3D(VolumeTexture3D *tex)
{ {
uint id = tex->GetTextureId(); uint id = tex->GetTextureId();
glDeleteTextures(1, &id); glDeleteTextures(1, &id);
} }