From 60a15fad8b893394eab8890a279b774be851a36b Mon Sep 17 00:00:00 2001 From: IlyaShurupov Date: Mon, 4 Nov 2024 22:54:10 +0300 Subject: [PATCH] Raster render updates --- 3DEditor/rsc/shaders/default.vert | 3 +- 3DEditor/rsc/shaders/solid.frag | 7 +++ Math/private/Camera.cpp | 8 ++- Math/public/Camera.hpp | 1 + Math/public/Mat.hpp | 26 ++++++--- Math/public/Topology.hpp | 2 +- Math/public/Vec.hpp | 17 ++++++ RasterRender/private/FrameBuffer.cpp | 2 +- RasterRender/private/Render.cpp | 85 +++++++++++++++++++--------- RasterRender/public/RasterRender.hpp | 9 +++ 10 files changed, 121 insertions(+), 39 deletions(-) create mode 100644 3DEditor/rsc/shaders/solid.frag diff --git a/3DEditor/rsc/shaders/default.vert b/3DEditor/rsc/shaders/default.vert index 7d1fd94..6a740e3 100644 --- a/3DEditor/rsc/shaders/default.vert +++ b/3DEditor/rsc/shaders/default.vert @@ -7,5 +7,6 @@ uniform mat4 Basis; uniform mat4 Camera; void main() { - gl_Position = Camera * vec4(Point.xyz, 1.0); + vec4 transformed = (Basis * vec4(Point.xyz, 1.0)) + Origin; + gl_Position = Camera * transformed; } \ No newline at end of file diff --git a/3DEditor/rsc/shaders/solid.frag b/3DEditor/rsc/shaders/solid.frag new file mode 100644 index 0000000..31e99ca --- /dev/null +++ b/3DEditor/rsc/shaders/solid.frag @@ -0,0 +1,7 @@ +#version 330 core + +out vec4 FragColor; + +void main() { + FragColor = vec4(1, 0, 0, 1.f); +} \ No newline at end of file diff --git a/Math/private/Camera.cpp b/Math/private/Camera.cpp index fffc32e..017b467 100644 --- a/Math/private/Camera.cpp +++ b/Math/private/Camera.cpp @@ -117,16 +117,20 @@ void Camera::rotate(halnf angleX, halnf angleY) { Vec3F wup(0, 0, 1); mPos -= mTarget; - mat3f rotZ = mat3f::rotatorDir(wup, angleX); + Mat3F rotZ = Mat3F::rotatorDir(wup, angleX); mPos = rotZ * mPos; mUp = rotZ * mUp; Vec3F f = mPos.unitV(); Vec3F s = mUp * f; - mPos = mat3f::rotatorDir(s, -angleY) * mPos; + mPos = Mat3F::rotatorDir(s, -angleY) * mPos; mPos += mTarget; lookAtPoint(mTarget, mPos, mUp); } + +void Camera::setPos(Vec3F pos) { + mPos = pos; +} diff --git a/Math/public/Camera.hpp b/Math/public/Camera.hpp index 2b2ba45..6ebc5b3 100644 --- a/Math/public/Camera.hpp +++ b/Math/public/Camera.hpp @@ -18,6 +18,7 @@ namespace tp { void setRatio(halnf ratio); void setFOV(halnf fov); void setFar(halnf far); + void setPos(Vec3F pos); [[nodiscard]] const Vec3F& getPos() const; [[nodiscard]] const Vec3F& getTarget() const; diff --git a/Math/public/Mat.hpp b/Math/public/Mat.hpp index d773169..0c0344a 100644 --- a/Math/public/Mat.hpp +++ b/Math/public/Mat.hpp @@ -495,8 +495,8 @@ namespace tp { }; template - using mat3 = Mat; - using mat3f = mat3; + using Mat3 = Mat; + using Mat3F = Mat3; template class Mat { @@ -647,22 +647,22 @@ namespace tp { Mat inv() { return cofactors() /= det(); } - Mat rotatorX(alnf angle) { + Mat rotatorX(alnf angle) const { alnf cosA = (alnf) cos(angle); alnf sinA = (alnf) sin(angle); return { { 1, 0, 0 }, { 0, cosA, -sinA }, { 0, sinA, cosA } }; } - Mat rotatorY(alnf angle) { + Mat rotatorY(alnf angle) const { alnf cosA = (alnf) cos(angle); alnf sinA = (alnf) sin(angle); return { { cosA, 0, sinA }, { 0, 1, 0 }, { -sinA, 0, cosA } }; } - Mat rotatorZ(alnf angle) { - alnf cosA = (alnf) cos(angle); - alnf sinA = (alnf) sin(angle); - return { { cosA, -sinA, 0 }, { sinA, cosA, 0 }, { 0, 0, 1 } }; + static Mat rotatorZ(alnf angle) { + Type cosA = (Type) cos(angle); + Type sinA = (Type) sin(angle); + return { vec{ cosA, -sinA, 0 }, vec{ sinA, cosA, 0 }, vec{ 0, 0, 1 } }; } static Mat rotatorDir(vec dir, alnf angle) { @@ -707,4 +707,14 @@ namespace tp { Type det() { return Type(); } }; + + template + Mat toMat4(const Mat& in) { + Mat out; + out[0] = { in[0][0], in[0][1], in[0][2], 0 }; + out[1] = { in[1][0], in[1][1], in[1][2], 0 }; + out[2] = { in[2][0], in[2][1], in[2][2], 0 }; + out[3] = Type(1); + return out; + } } diff --git a/Math/public/Topology.hpp b/Math/public/Topology.hpp index 92cb1a0..31efc10 100644 --- a/Math/public/Topology.hpp +++ b/Math/public/Topology.hpp @@ -30,7 +30,7 @@ namespace tp { struct Topology { Vec3F Origin = { 0, 0, 0 }; - mat3f Basis = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } }; + Mat3F Basis = { { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 } }; Buffer Points; Buffer Normals; diff --git a/Math/public/Vec.hpp b/Math/public/Vec.hpp index 0441fa8..0729046 100644 --- a/Math/public/Vec.hpp +++ b/Math/public/Vec.hpp @@ -110,6 +110,13 @@ namespace tp { return *this; } + Vec& operator=(Type val) { + for (ualni i = 0; i < tSize; i++) { + get(i) = val; + } + return *this; + } + void assign(Type val) { for (ualni i = 0; i < tSize; i++) { get(i) = val; @@ -576,4 +583,14 @@ namespace tp { using Vec4F = Vec4; using Vec4I = Vec4; + + template + Vec toVec4(const Vec& in) { + Vec out; + out[0] = in[0]; + out[1] = in[1]; + out[2] = in[2]; + out[3] = 0; + return out; + } } \ No newline at end of file diff --git a/RasterRender/private/FrameBuffer.cpp b/RasterRender/private/FrameBuffer.cpp index fd61110..0520051 100644 --- a/RasterRender/private/FrameBuffer.cpp +++ b/RasterRender/private/FrameBuffer.cpp @@ -102,7 +102,7 @@ void RenderBuffer::setViewport(const RectF& viewport) { void RenderBuffer::clear() { AssertGL(glClearColor(mClearCol.r, mClearCol.g, mClearCol.b, mClearCol.a)); - AssertGL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)); + AssertGL(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)); } void RenderBuffer::endDraw() { diff --git a/RasterRender/private/Render.cpp b/RasterRender/private/Render.cpp index 25cea38..af05b72 100644 --- a/RasterRender/private/Render.cpp +++ b/RasterRender/private/Render.cpp @@ -7,6 +7,7 @@ RasterRender::RasterRender() : mRenderBuffer({ 100, 100 }) { mDefaultShader.load("rsc/shaders/default.vert", nullptr, "rsc/shaders/default.frag", true); + mSolidShader.load("rsc/shaders/default.vert", nullptr, "rsc/shaders/solid.frag", true); } RasterRender::~RasterRender() {} @@ -15,6 +16,62 @@ uint4 RasterRender::getRenderBufferID() { return mRenderBuffer.texId(); } Vec2F RasterRender::getBufferSize() { return mRenderBuffer.getSize(); } +void RasterRender::bindCameraShaderAttributes(Mat4F cameraMat) { + static auto camera = (GLint) mDefaultShader.getu("Camera"); + glUniformMatrix4fv(camera, 1, true, &cameraMat[0][0]); +} + +void RasterRender::bindObjectShaderAttributes(const Object& object) { + static auto origin = (GLint) mDefaultShader.getu("Origin"); + static auto basis = (GLint) mDefaultShader.getu("Basis"); + + Mat4F basisMat = toMat4(object.mTopology.Basis); + Vec4F originPoint = toVec4(object.mTopology.Origin); + + glUniform4fv(origin, 1, &originPoint[0]); + glUniformMatrix4fv(basis, 1, false, &basisMat[0][0]); +} + +void RasterRender::renderDefault(const Scene& geometry) { + mDefaultShader.bind(); + + Mat4F cameraMat = geometry.mCamera.calculateTransformationMatrix(); + + glEnable(GL_DEPTH_TEST); + + // glPolygonMode(GL_FRONT, GL_LINE); + // glPolygonMode(GL_BACK, GL_LINE); + + // auto rotator = Mat3F::rotatorZ(alnf(0.001)); + + bindCameraShaderAttributes(cameraMat); + + for (auto object : geometry.mObjects) { + // object->mTopology.Origin += 0.01; + // object->mTopology.Basis = rotator * object->mTopology.Basis; + + bindObjectShaderAttributes(object.data()); + object->mGUPBuffers->drawCall(); + } + + mDefaultShader.unbind(); +} + +void RasterRender::renderOutline(const Camera& camera, const Object& object) { + glEnable(GL_STENCIL_TEST); + + mSolidShader.bind(); + + bindCameraShaderAttributes(camera.calculateTransformationMatrix()); + bindObjectShaderAttributes(object); + + object.mGUPBuffers->drawCall(); + + mSolidShader.unbind(); + + glDisable(GL_STENCIL_TEST); +} + void RasterRender::render(const Scene& geometry, const Vec2& size) { for (auto object : geometry.mObjects) { @@ -28,33 +85,9 @@ void RasterRender::render(const Scene& geometry, const Vec2& size) { mRenderBuffer.beginDraw(); mRenderBuffer.clear(); - mDefaultShader.bind(); - - Mat4F cameraMat = geometry.mCamera.calculateTransformationMatrix(); - - glEnable(GL_DEPTH_TEST); - - // glPolygonMode(GL_FRONT, GL_LINE); - // glPolygonMode(GL_BACK, GL_LINE); - - for (auto object : geometry.mObjects) { - - static auto origin = (GLint) mDefaultShader.getu("Origin"); - static auto basis = (GLint) mDefaultShader.getu("Basis"); - static auto camera = (GLint) mDefaultShader.getu("Camera"); - - Mat4F basisMat; - Vec4F originPoint; - - glUniform4fv(origin, 1, &originPoint[0]); - glUniformMatrix4fv(basis, 1, false, &basisMat[0][0]); - glUniformMatrix4fv(camera, 1, true, &cameraMat[0][0]); - - object->mGUPBuffers->drawCall(); - } - - mDefaultShader.unbind(); + renderDefault(geometry); + // if (geometry.mObjects.size()) renderOutline(geometry.mCamera, geometry.mObjects.first()); // glPolygonMode(GL_FRONT, GL_FILL); // glPolygonMode(GL_BACK, GL_FILL); diff --git a/RasterRender/public/RasterRender.hpp b/RasterRender/public/RasterRender.hpp index 229029d..12b4744 100644 --- a/RasterRender/public/RasterRender.hpp +++ b/RasterRender/public/RasterRender.hpp @@ -17,8 +17,17 @@ namespace tp { RenderBuffer* getRenderBuffer(); Vec2F getBufferSize(); + private: + void renderDefault(const Scene& geometry); + void renderOutline(const Camera& camera, const Object& object); + + void bindObjectShaderAttributes(const Object& object); + void bindCameraShaderAttributes(Mat4F cameraMat); + private: RenderBuffer mRenderBuffer; + RenderShader mDefaultShader; + RenderShader mSolidShader; }; } \ No newline at end of file