Example #1
0
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;
	}
}
Example #2
0
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;
}