Remove memory allocation when drawing triangles

This commit is contained in:
duarteapcoelho 2022-09-09 00:01:56 +01:00
parent b8fb21ec7a
commit 99483cab91
1 changed files with 16 additions and 32 deletions

View File

@ -91,11 +91,9 @@ namespace Rasterizer {
fp m;
Edge *next;
};
inline Edge *newEdge(vec3i p0, vec3i p1){
Edge *e = (Edge*) malloc(sizeof(Edge));
inline Edge newEdge(vec3i p0, vec3i p1){
if(p0.y > p1.y){
*e = {
return {
p1.y,
p0.y,
p1.x,
@ -103,7 +101,7 @@ namespace Rasterizer {
nullptr
};
} else if(p0.y < p1.y){
*e = {
return {
p0.y,
p1.y,
p0.x,
@ -111,11 +109,8 @@ namespace Rasterizer {
nullptr
};
} else {
free(e);
return nullptr;
return {p0.y, p1.y, p0.x, 0, nullptr};
}
return e;
}
inline void _drawTriangle(Model *model, Triangle triangle, bool useDepth, bool isShaded){
@ -144,7 +139,7 @@ namespace Rasterizer {
}
Edge *edgeTable[RENDER_HEIGHT];
Edge *edges[3] = {
Edge edges[3] = {
newEdge(p0, p1),
newEdge(p1, p2),
newEdge(p2, p0),
@ -152,31 +147,26 @@ namespace Rasterizer {
edgeTable[0] = nullptr;
for(int i = 0; i < 3; i++){
if(edges[i] != nullptr){
if(edges[i]->minY < minY){
Edge **e = &(edgeTable[0]);
while(*e != nullptr){
e = &((*e)->next);
}
*e = edges[i];
(*e)->x = (*e)->x + fp(-(*e)->minY) * (*e)->m;
if(edges[i].minY < minY){
Edge **e = &(edgeTable[0]);
while(*e != nullptr){
e = &((*e)->next);
}
*e = &edges[i];
(*e)->x = (*e)->x + fp(-(*e)->minY) * (*e)->m;
}
}
for(int y = minY; y < maxY; y++){
if(y != 0)
edgeTable[y] = nullptr;
// edgeTable[y] = nullptr;
for(int i = 0; i < 3; i++){
if(edges[i] != nullptr){
if(edges[i]->minY == y){
Edge **e = &(edgeTable[y]);
while(*e != nullptr){
e = &((*e)->next);
}
*e = edges[i];
if(edges[i].minY == y){
Edge **e = &(edgeTable[y]);
while(*e != nullptr){
e = &((*e)->next);
}
*e = &edges[i];
}
}
}
@ -225,12 +215,6 @@ namespace Rasterizer {
}
}
}
for(int i = 0; i < 3; i++){
if(edges[i] != nullptr){
free(edges[i]);
}
}
}
inline Mesh clipTriangleAgainstPlane(Triangle triangle, Plane plane){