nuclear@0: #include "meshgen.h" nuclear@0: #include "mesh.h" nuclear@0: #include "logger.h" nuclear@0: nuclear@15: using namespace goatgfx; nuclear@15: nuclear@0: // -------- sphere -------- nuclear@0: nuclear@0: #define SURAD(u) ((u) * 2.0 * M_PI) nuclear@0: #define SVRAD(v) ((v) * M_PI) nuclear@0: nuclear@0: static Vector3 sphvec(float theta, float phi) nuclear@0: { nuclear@0: return Vector3(sin(theta) * sin(phi), nuclear@0: cos(phi), nuclear@0: cos(theta) * sin(phi)); nuclear@0: } nuclear@0: nuclear@0: void gen_sphere(Mesh *mesh, float rad, int usub, int vsub, float urange, float vrange) nuclear@0: { nuclear@0: if(usub < 4) usub = 4; nuclear@0: if(vsub < 2) vsub = 2; nuclear@0: nuclear@0: int uverts = usub + 1; nuclear@0: int vverts = vsub + 1; nuclear@0: nuclear@0: int num_verts = uverts * vverts; nuclear@0: int num_quads = usub * vsub; nuclear@0: int num_tri = num_quads * 2; nuclear@0: nuclear@0: mesh->clear(); nuclear@0: Vector3 *varr = (Vector3*)mesh->set_attrib_data(MESH_ATTR_VERTEX, 3, num_verts, 0); nuclear@0: Vector3 *narr = (Vector3*)mesh->set_attrib_data(MESH_ATTR_NORMAL, 3, num_verts, 0); nuclear@0: Vector3 *tarr = (Vector3*)mesh->set_attrib_data(MESH_ATTR_TANGENT, 3, num_verts, 0); nuclear@0: Vector2 *uvarr = (Vector2*)mesh->set_attrib_data(MESH_ATTR_TEXCOORD, 2, num_verts, 0); nuclear@0: unsigned int *idxarr = mesh->set_index_data(num_tri * 3, 0); nuclear@0: nuclear@0: float du = urange / (float)(uverts - 1); nuclear@0: float dv = vrange / (float)(vverts - 1); nuclear@0: nuclear@0: float u = 0.0; nuclear@0: for(int i=0; iclear(); nuclear@0: Vector3 *varr = (Vector3*)mesh->set_attrib_data(MESH_ATTR_VERTEX, 3, num_verts, 0); nuclear@0: Vector3 *narr = (Vector3*)mesh->set_attrib_data(MESH_ATTR_NORMAL, 3, num_verts, 0); nuclear@0: Vector3 *tarr = (Vector3*)mesh->set_attrib_data(MESH_ATTR_TANGENT, 3, num_verts, 0); nuclear@0: Vector2 *uvarr = (Vector2*)mesh->set_attrib_data(MESH_ATTR_TEXCOORD, 2, num_verts, 0); nuclear@0: unsigned int *idxarr = mesh->set_index_data(num_tri * 3, 0); nuclear@0: nuclear@0: float du = urange / (float)(uverts - 1); nuclear@0: float dv = vrange / (float)(vverts - 1); nuclear@0: nuclear@0: float u = 0.0; nuclear@0: for(int i=0; iclear(); nuclear@0: Vector3 *varr = (Vector3*)mesh->set_attrib_data(MESH_ATTR_VERTEX, 3, num_verts, 0); nuclear@0: Vector3 *narr = (Vector3*)mesh->set_attrib_data(MESH_ATTR_NORMAL, 3, num_verts, 0); nuclear@0: Vector3 *tarr = (Vector3*)mesh->set_attrib_data(MESH_ATTR_TANGENT, 3, num_verts, 0); nuclear@0: Vector2 *uvarr = (Vector2*)mesh->set_attrib_data(MESH_ATTR_TEXCOORD, 2, num_verts, 0); nuclear@0: unsigned int *idxarr = mesh->set_index_data(num_tri * 3, 0); nuclear@0: nuclear@0: float du = urange / (float)(uverts - 1); nuclear@0: float dv = vrange / (float)(vverts - 1); nuclear@0: nuclear@0: float u = 0.0; nuclear@0: for(int i=0; iclear(); nuclear@0: nuclear@0: int uverts = usub + 1; nuclear@0: int vverts = vsub + 1; nuclear@0: int num_verts = uverts * vverts; nuclear@0: nuclear@0: int num_quads = usub * vsub; nuclear@0: int num_tri = num_quads * 2; nuclear@0: nuclear@0: Vector3 *varr = (Vector3*)mesh->set_attrib_data(MESH_ATTR_VERTEX, 3, num_verts, 0); nuclear@0: Vector3 *narr = (Vector3*)mesh->set_attrib_data(MESH_ATTR_NORMAL, 3, num_verts, 0); nuclear@0: Vector3 *tarr = (Vector3*)mesh->set_attrib_data(MESH_ATTR_TANGENT, 3, num_verts, 0); nuclear@0: Vector2 *uvarr = (Vector2*)mesh->set_attrib_data(MESH_ATTR_TEXCOORD, 2, num_verts, 0); nuclear@0: unsigned int *idxarr = mesh->set_index_data(num_tri * 3, 0); nuclear@0: nuclear@0: float du = 1.0 / (float)usub; nuclear@0: float dv = 1.0 / (float)vsub; nuclear@0: nuclear@0: float u = 0.0; nuclear@0: for(int i=0; i