chore: refactor to use shape nodes
This commit is contained in:
30
src/core/modifier.c
Normal file
30
src/core/modifier.c
Normal file
@@ -0,0 +1,30 @@
|
||||
#include "modifier.h"
|
||||
|
||||
VektorShapeNode vektor_shapenode_new(VektorShape shape) {
|
||||
VektorShapeNode node = (VektorShapeNode) {
|
||||
.base = shape,
|
||||
.modifier_count = 0,
|
||||
.evaluated = shape
|
||||
};
|
||||
return node;
|
||||
}
|
||||
|
||||
VektorShape* vektor_shapenode_get_evaluated(VektorShapeNode* shapeNode) {
|
||||
|
||||
return &shapeNode->evaluated;
|
||||
}
|
||||
|
||||
void vektor_shapenodebuf_add(VektorShapeNodeBuffer* buffer, VektorShapeNode node) {
|
||||
if (buffer->count >= buffer->capacity) {
|
||||
buffer->capacity = buffer->capacity ? buffer->capacity * 2 : 4;
|
||||
buffer->nodes =
|
||||
realloc(buffer->nodes, sizeof(VektorShapeNode) * buffer->capacity);
|
||||
}
|
||||
buffer->nodes[buffer->count++] = node;
|
||||
|
||||
if (buffer->count <= buffer->capacity / 4) {
|
||||
buffer->capacity /= 2;
|
||||
buffer->nodes =
|
||||
realloc(buffer->nodes, sizeof(VektorShapeNode) * buffer->capacity);
|
||||
}
|
||||
}
|
||||
44
src/core/modifier.h
Normal file
44
src/core/modifier.h
Normal file
@@ -0,0 +1,44 @@
|
||||
#ifndef VKTR_MODIFIER_H
|
||||
#define VKTR_MODIFIER_H
|
||||
|
||||
#include "src/core/primitives.h"
|
||||
|
||||
typedef enum {
|
||||
VEKTOR_MODIFIER_BEVEL
|
||||
} VektorModifierType;
|
||||
|
||||
typedef struct VektorModifier {
|
||||
VektorModifierType type;
|
||||
bool enabled;
|
||||
bool dirty;
|
||||
void* parameters;
|
||||
|
||||
VektorShape (*apply)(struct VektorModifier mod, VektorShape input);
|
||||
|
||||
} VektorModifier;
|
||||
|
||||
typedef struct VektorShapeNode {
|
||||
VektorShape base;
|
||||
VektorShape evaluated;
|
||||
|
||||
VektorModifier* modifiers;
|
||||
size_t modifier_count;
|
||||
|
||||
bool base_dirty;
|
||||
} VektorShapeNode;
|
||||
|
||||
typedef struct VektorShapeNodeBuffer {
|
||||
VektorShapeNode* nodes;
|
||||
size_t count;
|
||||
size_t capacity;
|
||||
} VektorShapeNodeBuffer;
|
||||
|
||||
VektorShapeNode vektor_shapenode_new(VektorShape shape);
|
||||
VektorShape* vektor_shapenode_get_evaluated(VektorShapeNode* shapeNode);
|
||||
void vektor_shapenode_modifier_add(VektorShapeNode* shapeNode, VektorModifier* mod);
|
||||
void vektor_shapenode_modifier_remove(VektorShapeNode* shapeNode, VektorModifier* mod);
|
||||
void vektor_shapenode_free(VektorShapeNode* shapeNode);
|
||||
|
||||
void vektor_shapenodebuf_add(VektorShapeNodeBuffer* buffer, VektorShapeNode node);
|
||||
|
||||
#endif
|
||||
@@ -2,6 +2,7 @@
|
||||
#include "epoxy/gl.h"
|
||||
#include "primitives.h"
|
||||
#include "src/core/matrix.h"
|
||||
#include "src/core/modifier.h"
|
||||
#include "src/core/vector.h"
|
||||
#include "stddef.h"
|
||||
#include <math.h>
|
||||
@@ -68,11 +69,11 @@ void vektor_rectangle_tessellate(EdgeBuffer* buffer, VektorRectangle* rct,
|
||||
vektor_edgebuffer_add_edge(buffer, left);
|
||||
}
|
||||
|
||||
void vektor_rasterize(VertexBuffer* vb, VektorShapeBuffer* shapes,
|
||||
void vektor_vb_rasterize(VertexBuffer* vb, VektorShapeNodeBuffer* nodes,
|
||||
double scale) {
|
||||
EdgeBuffer edges = {0};
|
||||
for (size_t i = 0; i < shapes->count; i++) {
|
||||
VektorPrimitive* p = &shapes->shapes[i].primitive;
|
||||
for (size_t i = 0; i < nodes->count; i++) {
|
||||
VektorPrimitive* p = &nodes->nodes[i].base.primitive;
|
||||
|
||||
switch (p->kind) {
|
||||
case VEKTOR_POLYLINE:
|
||||
@@ -97,7 +98,7 @@ void vektor_rasterize(VertexBuffer* vb, VektorShapeBuffer* shapes,
|
||||
}
|
||||
}
|
||||
|
||||
vektor_edges_to_triangles(vb, &edges, shapes);
|
||||
vektor_edges_to_triangles(vb, &edges, nodes);
|
||||
}
|
||||
|
||||
void vektor_vb_add_triangle(VertexBuffer* vb, V2 v0, V2 v1, V2 v2,
|
||||
@@ -133,7 +134,7 @@ void vektor_vb_add_quad(VertexBuffer* vb, V2 a, V2 b, VektorColor color) {
|
||||
}
|
||||
|
||||
void vektor_edge_to_triangles(VertexBuffer* vb, Edge e,
|
||||
VektorShapeBuffer* shape_buffer) {
|
||||
VektorShapeNodeBuffer* node_buffer) {
|
||||
float dx = e.p2.x - e.p1.x;
|
||||
float dy = e.p2.y - e.p1.y;
|
||||
float len = sqrtf(dx * dx + dy * dy);
|
||||
@@ -141,28 +142,28 @@ void vektor_edge_to_triangles(VertexBuffer* vb, Edge e,
|
||||
return;
|
||||
|
||||
float px =
|
||||
-dy / len * (shape_buffer->shapes[e.shape_id].style.stroke_width / 2);
|
||||
-dy / len * (node_buffer->nodes[e.shape_id].base.style.stroke_width / 2);
|
||||
float py =
|
||||
dx / len * (shape_buffer->shapes[e.shape_id].style.stroke_width / 2);
|
||||
dx / len * (node_buffer->nodes[e.shape_id].base.style.stroke_width / 2);
|
||||
|
||||
V2 v0 = m33_transform(shape_buffer->shapes[e.shape_id].transform,
|
||||
V2 v0 = m33_transform(node_buffer->nodes[e.shape_id].base.transform,
|
||||
(V2){e.p1.x + px, e.p1.y + py});
|
||||
V2 v1 = m33_transform(shape_buffer->shapes[e.shape_id].transform,
|
||||
V2 v1 = m33_transform(node_buffer->nodes[e.shape_id].base.transform,
|
||||
(V2){e.p1.x - px, e.p1.y - py});
|
||||
V2 v2 = m33_transform(shape_buffer->shapes[e.shape_id].transform,
|
||||
V2 v2 = m33_transform(node_buffer->nodes[e.shape_id].base.transform,
|
||||
(V2){e.p2.x + px, e.p2.y + py});
|
||||
V2 v3 = m33_transform(shape_buffer->shapes[e.shape_id].transform,
|
||||
V2 v3 = m33_transform(node_buffer->nodes[e.shape_id].base.transform,
|
||||
(V2){e.p2.x - px, e.p2.y - py});
|
||||
|
||||
vektor_vb_add_triangle(vb, v0, v1, v2,
|
||||
shape_buffer->shapes[e.shape_id].style.stroke_color);
|
||||
node_buffer->nodes[e.shape_id].base.style.stroke_color);
|
||||
vektor_vb_add_triangle(vb, v2, v1, v3,
|
||||
shape_buffer->shapes[e.shape_id].style.stroke_color);
|
||||
node_buffer->nodes[e.shape_id].base.style.stroke_color);
|
||||
}
|
||||
|
||||
void vektor_edges_to_triangles(VertexBuffer* vb, EdgeBuffer* edges,
|
||||
VektorShapeBuffer* shape_buffer) {
|
||||
VektorShapeNodeBuffer* node_buffer) {
|
||||
for (size_t i = 0; i < edges->count; i++) {
|
||||
vektor_edge_to_triangles(vb, edges->edges[i], shape_buffer);
|
||||
vektor_edge_to_triangles(vb, edges->edges[i], node_buffer);
|
||||
}
|
||||
}
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "primitives.h"
|
||||
|
||||
#include "../util/color.h"
|
||||
#include "src/core/modifier.h"
|
||||
#include "stddef.h"
|
||||
#include "vector.h"
|
||||
#include <stddef.h>
|
||||
@@ -48,10 +49,10 @@ void vektor_vb_add_triangle(VertexBuffer* vb, V2 v0, V2 v1, V2 v2,
|
||||
void vektor_vb_add_quad(VertexBuffer* vb, V2 v0, V2 v1, VektorColor color);
|
||||
|
||||
void vektor_edge_to_triangles(VertexBuffer* vb, Edge e,
|
||||
VektorShapeBuffer* shape_buffer);
|
||||
VektorShapeNodeBuffer* node_buffer);
|
||||
void vektor_edges_to_triangles(VertexBuffer* vb, EdgeBuffer* edges,
|
||||
VektorShapeBuffer* shape_buffer);
|
||||
void vektor_rasterize(VertexBuffer* vb, VektorShapeBuffer* shapes,
|
||||
VektorShapeNodeBuffer* node_buffer) ;
|
||||
void vektor_vb_rasterize(VertexBuffer* vb, VektorShapeNodeBuffer* shapes,
|
||||
double scale);
|
||||
|
||||
#endif // RASTER_H_
|
||||
|
||||
Reference in New Issue
Block a user