mirror of
https://github.com/ApfelTeeSaft/vb01.git
synced 2026-08-26 19:33:45 +00:00
fixed quad subdivision bugs
This commit is contained in:
@@ -1,6 +1,10 @@
|
||||
#include "quad.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
namespace vb01{
|
||||
using namespace std;
|
||||
|
||||
Quad::Quad(Vector3 size, bool spatial, int numVertDiv, int numHorDiv){
|
||||
this->spatial = spatial;
|
||||
this->numVertDiv = numVertDiv;
|
||||
@@ -14,58 +18,72 @@ namespace vb01{
|
||||
this->size = size;
|
||||
|
||||
const int numHorQuads = numVertDiv + 1, numVertQuads = numHorDiv + 1;
|
||||
const int numTris = 2 * numHorQuads * numVertQuads, numVerts = 3 * numTris;
|
||||
const int numVertPos = (numHorQuads + 1) * (numVertQuads + 1), numTris = 2 * numHorQuads * numVertQuads, numVerts = 3 * numTris;
|
||||
Vector2 subQuadSize = Vector2(size.x / numHorQuads, size.y / numVertQuads);
|
||||
|
||||
MeshData::Vertex *vertices = new MeshData::Vertex[numVerts];
|
||||
Vector3 *faceVertPos = new Vector3[6];
|
||||
|
||||
Vector3 *norm = new Vector3(Vector3::VEC_J);
|
||||
if(!meshBase.positions){
|
||||
meshBase.positions = new Vector3[numVertPos];
|
||||
meshBase.normals = new Vector3(Vector3::VEC_J);
|
||||
meshBase.indices = new u32[numVerts];
|
||||
|
||||
for(int i = 0; i < numVerts; i++)
|
||||
meshBase.indices[i] = i;
|
||||
}
|
||||
|
||||
Vector3 *faceVertPos = meshBase.positions;
|
||||
Vector3 *norm = meshBase.normals;
|
||||
u32 *indices = meshBase.indices;
|
||||
|
||||
for(int i = 0; i < numHorQuads; i++){
|
||||
for(int j = 0; j < numVertQuads; j++){
|
||||
int id = i * 6 * numHorQuads + j * 6;
|
||||
int vertPosId = i * (numHorQuads + 1) + j;
|
||||
int vertPosId2 = (i + 1) * (numHorQuads + 1) + j;
|
||||
Vector2 offset = Vector2(subQuadSize.x, subQuadSize.y);
|
||||
|
||||
faceVertPos[0] = Vector3(-.5 * size.x + offset.x * j, 0, -.5 * size.y + offset.y * i);
|
||||
faceVertPos[1] = Vector3(-.5 * size.x + offset.x * (j + 1), 0, -.5 * size.y + offset.y * (i + 1));
|
||||
faceVertPos[2] = Vector3(-.5 * size.x + offset.x * (j + 1), 0, -.5 * size.y + offset.y * i);
|
||||
faceVertPos[3] = Vector3(-.5 * size.x + offset.x * j, 0, -.5 * size.y + offset.y * i);
|
||||
faceVertPos[4] = Vector3(-.5 * size.x + offset.x * j, 0, -.5 * size.y + offset.y * (i + 1));
|
||||
faceVertPos[5] = Vector3(-.5 * size.x + offset.x * (j + 1), 0, -.5 * size.y + offset.y * (i + 1));
|
||||
faceVertPos[vertPosId] = Vector3(-.5 * size.x + offset.x * i, 0, -.5 * size.y + offset.y * j);
|
||||
faceVertPos[vertPosId + 1] = Vector3(-.5 * size.x + offset.x * i, 0, -.5 * size.y + offset.y * (j + 1));
|
||||
faceVertPos[vertPosId2] = Vector3(-.5 * size.x + offset.x * (i + 1), 0, -.5 * size.y + offset.y * j);
|
||||
faceVertPos[vertPosId2 + 1] = Vector3(-.5 * size.x + offset.x * (i + 1), 0, -.5 * size.y + offset.y * (j + 1));
|
||||
|
||||
if(!spatial){
|
||||
int ids[4]{vertPosId, vertPosId + 1, vertPosId2, vertPosId2 + 1};
|
||||
|
||||
swap(faceVertPos[ids[0]].z, faceVertPos[ids[1]].z);
|
||||
swap(faceVertPos[ids[2]].z, faceVertPos[ids[3]].z);
|
||||
|
||||
for(int k = 0; k < 4; k++){
|
||||
faceVertPos[ids[k]].y = -faceVertPos[ids[k]].z;
|
||||
faceVertPos[ids[k]].z = 0;
|
||||
faceVertPos[ids[k]] += .5 * Vector3(size.x, size.y, 0);
|
||||
}
|
||||
}
|
||||
|
||||
Vector2 faceVertUv[]{
|
||||
Vector2(float(j) / numHorQuads, float(i) / numVertQuads),
|
||||
Vector2(float(j + 1) / numHorQuads, float(i + 1) / numVertQuads),
|
||||
Vector2(float(j + 1) / numHorQuads, float(i) / numVertQuads),
|
||||
Vector2(float(j) / numHorQuads, float(i) / numVertQuads),
|
||||
Vector2(float(j) / numHorQuads, float(i + 1) / numVertQuads),
|
||||
Vector2(float(j + 1) / numHorQuads, float(i + 1) / numVertQuads),
|
||||
Vector2(float(i) / numHorQuads, 1 - float(j) / numVertQuads),
|
||||
Vector2(float(i) / numHorQuads, 1 - float(j + 1) / numVertQuads),
|
||||
Vector2(float(i + 1) / numHorQuads, 1 - float(j + 1) / numVertQuads),
|
||||
Vector2(float(i + 1) / numHorQuads, 1 - float(j + 1) / numVertQuads),
|
||||
Vector2(float(i + 1) / numHorQuads, 1 - float(j) / numVertQuads),
|
||||
Vector2(float(i) / numHorQuads, 1 - float(j) / numVertQuads),
|
||||
};
|
||||
|
||||
for(int k = 0; k < 6; k++){
|
||||
if(!spatial){
|
||||
faceVertPos[k].y = -faceVertPos[k].z;
|
||||
faceVertPos[k].z = 0;
|
||||
faceVertPos[k] += .5 * Vector3(size.x, size.y, 0);
|
||||
}
|
||||
int quadId = 6 * (i * numHorQuads + j);
|
||||
int vertPosIds[6]{vertPosId, vertPosId + 1, vertPosId2 + 1, vertPosId2 + 1, vertPosId2, vertPosId};
|
||||
|
||||
for(int k = 0; k < 6; k++){
|
||||
MeshData::Vertex v;
|
||||
v.pos = &faceVertPos[k];
|
||||
v.pos = &faceVertPos[vertPosIds[k]];
|
||||
v.uv = faceVertUv[k];
|
||||
v.tan = Vector3::VEC_I;
|
||||
v.norm = norm;
|
||||
v.biTan = Vector3::VEC_K;
|
||||
vertices[id + k] = v;
|
||||
vertices[quadId + k] = v;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
u32 *indices = new u32[numVerts];
|
||||
|
||||
for(int i = 0; i < numVerts; i++)
|
||||
indices[i] = i;
|
||||
|
||||
meshBase = MeshData((Vector3*)faceVertPos, nullptr, nullptr, nullptr, 6, nullptr, vertices, indices, numTris);
|
||||
meshBase = MeshData(faceVertPos, nullptr, nullptr, nullptr, 6, norm, vertices, indices, numTris);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user