render from json

This commit is contained in:
2026-02-19 22:41:46 -06:00
parent 74c980adb0
commit ce43c56ea6
11 changed files with 537 additions and 171 deletions

View File

@@ -14,8 +14,8 @@ namespace Archimedes {
public:
Body(RenderTarget rt, glm::mat4 t = glm::mat4(1.0f)) : Object(t), mesh(rt) {};
Body(VertexBuffer vb, IndexArray ia, VertexLayout vl, Shader s, glm::mat4 t = glm::mat4(1.0f))
: Object(t), mesh(vb, ia, vl, s) {}
Body(VertexBuffer vb, IndexArray ia, VertexLayout vl, Shader s, RenderMode rm = RenderMode::Triangles, glm::mat4 t = glm::mat4(1.0f))
: Object(t), mesh(vb, ia, vl, s, rm) {}
Body() : Object(glm::mat4(1.0f)) {}

View File

@@ -19,6 +19,11 @@ namespace Archimedes {
~Camera() {};
const glm::mat4& getPerspective() { return perspective; }
void setPerspective(const glm::mat4 m) { perspective = m; }
private:
glm::mat4 perspective = glm::mat4(1.0f);
};
}

View File

@@ -66,6 +66,7 @@ namespace Archimedes {
float& getScale() { return scale; }
const glm::mat4& getTransform() { return worldTransform; }
void setTransform(const glm::mat4 m) { worldTransform = m; }
private:

View File

@@ -7,6 +7,16 @@
namespace Archimedes {
enum class RenderMode {
Points,
Lines,
ConnectedLines,
ConnectedLinesLooped,
Triangles,
Quads,
Polygon
};
class LayoutElement {
public:
@@ -154,19 +164,21 @@ namespace Archimedes {
class RenderTarget {
public:
RenderTarget(const std::vector<float> data, const std::vector<unsigned int> indices, VertexLayout layout, const std::string& vs, const std::string& fs)
RenderTarget(const std::vector<float> data, const std::vector<unsigned int> indices, VertexLayout layout, const std::string& vs, const std::string& fs, RenderMode rm = RenderMode::Triangles)
: vertexBuffer(data),
indexArray(indices),
layout(layout),
shader(vs, fs, Shader::LoadType::FromFileSource) {
shader(vs, fs, Shader::LoadType::FromFileSource),
renderMode(rm) {
}
RenderTarget(VertexBuffer vb, IndexArray ia, VertexLayout vl, Shader s)
RenderTarget(VertexBuffer vb, IndexArray ia, VertexLayout vl, Shader s, RenderMode rm = RenderMode::Triangles)
: vertexBuffer(vb),
indexArray(ia),
layout(vl),
shader(s) {
shader(s),
renderMode(rm) {
}
@@ -174,6 +186,9 @@ namespace Archimedes {
~RenderTarget() {}
void setActive(bool b) { active = b; }
const bool getActive() const { return active; }
//private:
VertexBuffer vertexBuffer;
@@ -186,6 +201,10 @@ namespace Archimedes {
Shader shader;
RenderMode renderMode;
bool active = false;
};
}

View File

@@ -13,13 +13,6 @@ namespace Archimedes {
public:
enum class RenderMode {
Triangles,
Lines,
ConnectedLines,
ConnectedLinesLooped,
Points
};
int w, h;
@@ -35,7 +28,7 @@ namespace Archimedes {
virtual Shader createShader(const std::string& vs, const std::string& fs, const Shader::LoadType& lt) = 0;
virtual void useShader(Shader& shader) = 0;
virtual void setupShader(Shader& shader) = 0;
virtual RenderTarget createRenderTarget(
VertexBuffer vb,
@@ -55,8 +48,7 @@ namespace Archimedes {
const glm::mat4 world = glm::mat4(1.0f),
const glm::mat4 view = glm::mat4(1.0f),
const glm::mat4 proj = glm::mat4(1.0f),
glm::vec4 color = { 1.0f, 0.0f, 1.0f, 1.0f },
RenderMode mode = RenderMode::Triangles
const glm::vec4 color = { 1.0f, 0.0f, 1.0f, 1.0f }
) = 0;
virtual Renderer* getRendererImpl() = 0;

View File

@@ -92,7 +92,7 @@ namespace Archimedes {
return shader;
}
void useShader(Shader& shader) override {
void setupShader(Shader& shader) override {
std::string vss = shader.getVSource();
std::string fss = shader.getFSource();
@@ -145,30 +145,7 @@ namespace Archimedes {
auto rt = RenderTarget(vb, ia, layout, s);
glGenVertexArrays(1, &rt.vertexArray.id);
glGenBuffers(1, &rt.vertexBuffer.id);
glBindVertexArray(rt.vertexArray.id);
glBindBuffer(GL_ARRAY_BUFFER, rt.vertexBuffer.id);
glBufferData(GL_ARRAY_BUFFER, vb.getSize(), vb.getData(), GL_STATIC_DRAW);
glGenBuffers(1, &rt.indexArray.id);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, rt.indexArray.id);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, rt.indexArray.getCount() * sizeof(unsigned int), rt.indexArray.getIndicies(), GL_STATIC_DRAW);
glUseProgram(s.id);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
setupRenderTarget(rt);
return rt;
};
@@ -216,8 +193,7 @@ namespace Archimedes {
const glm::mat4 world = glm::mat4(1.0f),
const glm::mat4 view = glm::mat4(1.0f),
const glm::mat4 proj = glm::mat4(1.0f),
glm::vec4 color = { 1.0f, 0.0f, 1.0f, 1.0f },
RenderMode mode = RenderMode::Triangles
const glm::vec4 color = { 1.0f, 0.0f, 1.0f, 1.0f }
) override {
glUseProgram(rt.shader.id);
@@ -236,7 +212,7 @@ namespace Archimedes {
glBindVertexArray(rt.vertexArray.id);
switch(mode) {
switch(rt.renderMode) {
case RenderMode::Triangles:
glDrawElements(GL_TRIANGLES, rt.indexArray.getCount(), GL_UNSIGNED_INT, nullptr);
break;
@@ -249,6 +225,12 @@ namespace Archimedes {
case RenderMode::ConnectedLinesLooped:
glDrawElements(GL_LINE_LOOP, rt.indexArray.getCount(), GL_UNSIGNED_INT, nullptr);
break;
case RenderMode::Quads:
glDrawElements(GL_QUADS, rt.indexArray.getCount(), GL_UNSIGNED_INT, nullptr);
break;
case RenderMode::Polygon:
glDrawElements(GL_POLYGON, rt.indexArray.getCount(), GL_UNSIGNED_INT, nullptr);
break;
case RenderMode::Points:
glDrawElements(GL_POINTS, rt.indexArray.getCount(), GL_UNSIGNED_INT, nullptr);
break;