Raster render updates

This commit is contained in:
IlyaShurupov 2024-11-04 22:54:10 +03:00 committed by Ilya Shurupov
parent 8fc76a81f3
commit 8d167b960a
10 changed files with 121 additions and 39 deletions

View file

@ -7,5 +7,6 @@ uniform mat4 Basis;
uniform mat4 Camera; uniform mat4 Camera;
void main() { void main() {
gl_Position = Camera * vec4(Point.xyz, 1.0); vec4 transformed = (Basis * vec4(Point.xyz, 1.0)) + Origin;
gl_Position = Camera * transformed;
} }

View file

@ -0,0 +1,7 @@
#version 330 core
out vec4 FragColor;
void main() {
FragColor = vec4(1, 0, 0, 1.f);
}

View file

@ -117,16 +117,20 @@ void Camera::rotate(halnf angleX, halnf angleY) {
Vec3F wup(0, 0, 1); Vec3F wup(0, 0, 1);
mPos -= mTarget; mPos -= mTarget;
mat3f rotZ = mat3f::rotatorDir(wup, angleX); Mat3F rotZ = Mat3F::rotatorDir(wup, angleX);
mPos = rotZ * mPos; mPos = rotZ * mPos;
mUp = rotZ * mUp; mUp = rotZ * mUp;
Vec3F f = mPos.unitV(); Vec3F f = mPos.unitV();
Vec3F s = mUp * f; Vec3F s = mUp * f;
mPos = mat3f::rotatorDir(s, -angleY) * mPos; mPos = Mat3F::rotatorDir(s, -angleY) * mPos;
mPos += mTarget; mPos += mTarget;
lookAtPoint(mTarget, mPos, mUp); lookAtPoint(mTarget, mPos, mUp);
} }
void Camera::setPos(Vec3F pos) {
mPos = pos;
}

View file

@ -18,6 +18,7 @@ namespace tp {
void setRatio(halnf ratio); void setRatio(halnf ratio);
void setFOV(halnf fov); void setFOV(halnf fov);
void setFar(halnf far); void setFar(halnf far);
void setPos(Vec3F pos);
[[nodiscard]] const Vec3F& getPos() const; [[nodiscard]] const Vec3F& getPos() const;
[[nodiscard]] const Vec3F& getTarget() const; [[nodiscard]] const Vec3F& getTarget() const;

View file

@ -495,8 +495,8 @@ namespace tp {
}; };
template <typename Type> template <typename Type>
using mat3 = Mat<Type, 3, 3>; using Mat3 = Mat<Type, 3, 3>;
using mat3f = mat3<halnf>; using Mat3F = Mat3<halnf>;
template <typename Type> template <typename Type>
class Mat<Type, 3, 3> { class Mat<Type, 3, 3> {
@ -647,22 +647,22 @@ namespace tp {
Mat inv() { return cofactors() /= det(); } Mat inv() { return cofactors() /= det(); }
Mat rotatorX(alnf angle) { Mat rotatorX(alnf angle) const {
alnf cosA = (alnf) cos(angle); alnf cosA = (alnf) cos(angle);
alnf sinA = (alnf) sin(angle); alnf sinA = (alnf) sin(angle);
return { { 1, 0, 0 }, { 0, cosA, -sinA }, { 0, sinA, cosA } }; 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 cosA = (alnf) cos(angle);
alnf sinA = (alnf) sin(angle); alnf sinA = (alnf) sin(angle);
return { { cosA, 0, sinA }, { 0, 1, 0 }, { -sinA, 0, cosA } }; return { { cosA, 0, sinA }, { 0, 1, 0 }, { -sinA, 0, cosA } };
} }
Mat rotatorZ(alnf angle) { static Mat rotatorZ(alnf angle) {
alnf cosA = (alnf) cos(angle); Type cosA = (Type) cos(angle);
alnf sinA = (alnf) sin(angle); Type sinA = (Type) sin(angle);
return { { cosA, -sinA, 0 }, { sinA, cosA, 0 }, { 0, 0, 1 } }; return { vec{ cosA, -sinA, 0 }, vec{ sinA, cosA, 0 }, vec{ 0, 0, 1 } };
} }
static Mat rotatorDir(vec dir, alnf angle) { static Mat rotatorDir(vec dir, alnf angle) {
@ -707,4 +707,14 @@ namespace tp {
Type det() { return Type(); } Type det() { return Type(); }
}; };
template<typename Type>
Mat<Type, 4, 4> toMat4(const Mat<Type, 3, 3>& in) {
Mat<Type, 4, 4> 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;
}
} }

View file

@ -30,7 +30,7 @@ namespace tp {
struct Topology { struct Topology {
Vec3F Origin = { 0, 0, 0 }; 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<Vec3F> Points; Buffer<Vec3F> Points;
Buffer<Vec3F> Normals; Buffer<Vec3F> Normals;

View file

@ -110,6 +110,13 @@ namespace tp {
return *this; return *this;
} }
Vec& operator=(Type val) {
for (ualni i = 0; i < tSize; i++) {
get(i) = val;
}
return *this;
}
void assign(Type val) { void assign(Type val) {
for (ualni i = 0; i < tSize; i++) { for (ualni i = 0; i < tSize; i++) {
get(i) = val; get(i) = val;
@ -576,4 +583,14 @@ namespace tp {
using Vec4F = Vec4<halnf>; using Vec4F = Vec4<halnf>;
using Vec4I = Vec4<halni>; using Vec4I = Vec4<halni>;
template <typename Type>
Vec<Type, 4> toVec4(const Vec<Type, 3>& in) {
Vec<Type, 4> out;
out[0] = in[0];
out[1] = in[1];
out[2] = in[2];
out[3] = 0;
return out;
}
} }

View file

@ -102,7 +102,7 @@ void RenderBuffer::setViewport(const RectF& viewport) {
void RenderBuffer::clear() { void RenderBuffer::clear() {
AssertGL(glClearColor(mClearCol.r, mClearCol.g, mClearCol.b, mClearCol.a)); 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() { void RenderBuffer::endDraw() {

View file

@ -7,6 +7,7 @@ RasterRender::RasterRender() :
mRenderBuffer({ 100, 100 }) mRenderBuffer({ 100, 100 })
{ {
mDefaultShader.load("rsc/shaders/default.vert", nullptr, "rsc/shaders/default.frag", true); 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() {} RasterRender::~RasterRender() {}
@ -15,6 +16,62 @@ uint4 RasterRender::getRenderBufferID() { return mRenderBuffer.texId(); }
Vec2F RasterRender::getBufferSize() { return mRenderBuffer.getSize(); } 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<ualni>& size) { void RasterRender::render(const Scene& geometry, const Vec2<ualni>& size) {
for (auto object : geometry.mObjects) { for (auto object : geometry.mObjects) {
@ -28,33 +85,9 @@ void RasterRender::render(const Scene& geometry, const Vec2<ualni>& size) {
mRenderBuffer.beginDraw(); mRenderBuffer.beginDraw();
mRenderBuffer.clear(); mRenderBuffer.clear();
mDefaultShader.bind(); renderDefault(geometry);
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();
// if (geometry.mObjects.size()) renderOutline(geometry.mCamera, geometry.mObjects.first());
// glPolygonMode(GL_FRONT, GL_FILL); // glPolygonMode(GL_FRONT, GL_FILL);
// glPolygonMode(GL_BACK, GL_FILL); // glPolygonMode(GL_BACK, GL_FILL);

View file

@ -17,8 +17,17 @@ namespace tp {
RenderBuffer* getRenderBuffer(); RenderBuffer* getRenderBuffer();
Vec2F getBufferSize(); 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: private:
RenderBuffer mRenderBuffer; RenderBuffer mRenderBuffer;
RenderShader mDefaultShader; RenderShader mDefaultShader;
RenderShader mSolidShader;
}; };
} }