feat: modelmatrix
This commit is contained in:
29
renderer.hpp
29
renderer.hpp
@@ -20,15 +20,16 @@ class Renderer {
|
||||
bool clearTarget = true;
|
||||
vec3 sunDir = vec3(1.0, -1.0, 1.0).normalize();
|
||||
|
||||
void toScreenSpace(vec3 *p) {
|
||||
p->x() = p->x() / p->z() * decimal(2.0) * decimal(SCREEN_SPACE_SIZE) +
|
||||
void toScreenSpace(vec3 *np, mat4 matrix) {
|
||||
vec4 tp = (matrix * vec4(*np, decimal(1.0f)));
|
||||
tp.x() = tp.x() / tp.z() * decimal(2.0) * decimal(SCREEN_SPACE_SIZE) +
|
||||
decimal(SCREEN_SPACE_SIZE);
|
||||
p->y() = p->y() / p->z() * decimal(2.0) * decimal(SCREEN_SPACE_SIZE) +
|
||||
tp.y() = tp.y() / tp.z() * decimal(2.0) * decimal(SCREEN_SPACE_SIZE) +
|
||||
decimal(SCREEN_SPACE_SIZE);
|
||||
p->z() = p->z();
|
||||
*np = vec3(tp.x(), tp.y(), tp.z());
|
||||
}
|
||||
|
||||
void render(const model *model) {
|
||||
void render(const model *model, const mat4 matrix) {
|
||||
decimal widthScale =
|
||||
decimal(SCREEN_SPACE_SIZE * 2) / decimal((float)target->width);
|
||||
decimal heightScale =
|
||||
@@ -44,6 +45,7 @@ class Renderer {
|
||||
// memset((wchar_t *)target->pixels, 0,
|
||||
// target->height * target->width * sizeof(target[0]));
|
||||
target->clearDepth();
|
||||
target->clearTarget();
|
||||
}
|
||||
|
||||
vec3 verts[model->verts.size()] = {};
|
||||
@@ -51,7 +53,13 @@ class Renderer {
|
||||
std::copy(model->verts.begin(), model->verts.end(), verts);
|
||||
|
||||
for (int i = 0; i < model->verts.size(); i++) {
|
||||
toScreenSpace(verts + i);
|
||||
toScreenSpace(verts + i, matrix);
|
||||
}
|
||||
|
||||
vec3 normals[model->normals.size()] = {};
|
||||
mat3 normalMatrix = matrix.cutTo<mat3>();
|
||||
for (int i = 0; i < model->normals.size(); i++) {
|
||||
normals[i] = normalMatrix * model->normals[i];
|
||||
}
|
||||
|
||||
polygon testP;
|
||||
@@ -62,8 +70,7 @@ class Renderer {
|
||||
testP.points[p] = verts[std::get<0>(model->faces[f + p])];
|
||||
testP.colors[p] =
|
||||
model->colors[std::get<0>(model->faces[f + p])];
|
||||
testP.normals[p] =
|
||||
model->normals[std::get<1>(model->faces[f + p])];
|
||||
testP.normals[p] = normals[std::get<1>(model->faces[f + p])];
|
||||
}
|
||||
if ((testP.avgNormal() * vec3(0.0, 0.0, 1.0)) > decimal(0.))
|
||||
continue;
|
||||
@@ -86,8 +93,6 @@ class Renderer {
|
||||
for (int y = startY; y < endY; y++) {
|
||||
|
||||
if (testP.depContains(pos)) {
|
||||
if (testP.small)
|
||||
continue;
|
||||
|
||||
testP.calcBarycentric(pos);
|
||||
decimal depth = testP.calcDepth();
|
||||
@@ -108,6 +113,10 @@ class Renderer {
|
||||
// target->set(x, y,
|
||||
// (normal + vec3(1.0, 1.0, 1.0)) *
|
||||
// decimal(120.0));
|
||||
// target->set(
|
||||
// x, y,
|
||||
// (testP.avgNormal() + vec3(1.0, 1.0, 1.0)) *
|
||||
// decimal(120.0));
|
||||
// target->set(x, y,
|
||||
// testP.barycentrics * decimal(200.0));
|
||||
// if (!factors.isSmall())
|
||||
|
||||
Reference in New Issue
Block a user