void LoadObjFileStateMachine(U8 * line, VertexArray & varray) { static Vector3 v; switch (line[0]) { case 'v': switch (line[1]) { case ' ': /* Simple vertex */ sscanf((const char *)line,"v %f %f %f",&v.x,&v.y,&v.z); varray.push_back(v); break; default: break; } break; default: break; } }
void World::_buildChunkVarr(int chunkX,int chunkZ,VertexArray& varr) const { auto& c = _getChunk(chunkX,chunkZ); //std::cout << "Building chunk varr" << std::endl; //int vertCount = varr.size(); for(int x=-1;x<=Chunk::WIDTH;++x) { for(int z=-1;z<=Chunk::WIDTH;++z) { for(int y=-1;y<=Chunk::HEIGHT;++y) { bool validX = (x >= 0 && x < Chunk::WIDTH), validY = (y >= 0 && y < Chunk::HEIGHT), validZ = (z >= 0 && z < Chunk::WIDTH); //if((validX && validY && validZ && c.blocks[x][z][y].filled) || // (validY && ((!validX && validZ) || (validX && !validZ)) && if(validY && getBlock(chunkX*Chunk::WIDTH+x, y, chunkZ*Chunk::WIDTH+z).filled) { if((x < 0 || z < 0) && y >= SEALEVEL) { //std::cout << Vec3i{{x,y,z}} << std::endl; } continue; } float fx = x,fy = y,fz = z; if(validY && validZ) { auto normal = Vec3f{{1,0,0}}; if(x > 0 && c.blocks[x-1][z][y].filled) { auto color = c.blocks[x-1][z][y].color; varr.push_back({ {{fx,fy, fz}}, color,normal }); varr.push_back({ {{fx,fy+1,fz}}, color,normal }); varr.push_back({ {{fx,fy+1,fz+1}}, color,normal }); varr.push_back({ {{fx,fy, fz+1}}, color,normal }); } if(x < Chunk::WIDTH-1 && c.blocks[x+1][z][y].filled) { auto color = c.blocks[x+1][z][y].color; varr.push_back({ {{fx+1,fy, fz}}, color,-normal }); varr.push_back({ {{fx+1,fy, fz+1}}, color,-normal }); varr.push_back({ {{fx+1,fy+1,fz+1}}, color,-normal }); varr.push_back({ {{fx+1,fy+1,fz}}, color,-normal }); } } if(validX && validY) { auto normal = Vec3f{{0,0,1}}; if(z > 0 && c.blocks[x][z-1][y].filled) { auto color = c.blocks[x][z-1][y].color; varr.push_back({ {{fx, fy, fz}},color,normal}); varr.push_back({ {{fx+1,fy, fz}},color,normal}); varr.push_back({ {{fx+1,fy+1,fz}},color,normal}); varr.push_back({ {{fx, fy+1,fz}},color,normal}); } if(z < Chunk::WIDTH-1 && c.blocks[x][z+1][y].filled) { auto color = c.blocks[x][z+1][y].color; varr.push_back({ {{fx, fy, fz+1}}, color,-normal }); varr.push_back({ {{fx, fy+1,fz+1}}, color,-normal }); varr.push_back({ {{fx+1,fy+1,fz+1}}, color,-normal }); varr.push_back({ {{fx+1,fy, fz+1}}, color,-normal }); } } if(validX && validZ) { auto normal = Vec3f{{0,1,0}}; if(y > 0 && c.blocks[x][z][y-1].filled) { auto color = c.blocks[x][z][y-1].color; varr.push_back({ {{fx, fy,fz}}, color,normal}); varr.push_back({ {{fx, fy,fz+1}},color,normal}); varr.push_back({ {{fx+1,fy,fz+1}},color,normal}); varr.push_back({ {{fx+1,fy,fz}}, color,normal}); } if(y < Chunk::HEIGHT-1 && c.blocks[x][z][y+1].filled) { auto color = c.blocks[x][z][y+1].color; varr.push_back({ {{fx, fy+1,fz}}, color,-normal}); varr.push_back({ {{fx+1,fy+1,fz}}, color,-normal}); varr.push_back({ {{fx+1,fy+1,fz+1}},color,-normal}); varr.push_back({ {{fx, fy+1,fz+1}},color,-normal}); } } } } } //std::cout << varr.size()-vertCount << " verts" << std::endl; }