static void loadBspGeometry(Bsp *bsp, void *faceData, int32_t faceSize, void *edgeData, int32_t edgeSize, void *ledgeData, int32_t ledgeSize){ bsp->numFaces = faceSize / sizeof(FaceDef); bsp->faces = malloc(sizeof(Face)*bsp->numFaces); FaceDef *faces = malloc(faceSize); memcpy(faces, faceData, faceSize); EdgeDef *edges = malloc(edgeSize); memcpy(edges, edgeData, edgeSize); int32_t *ledges = malloc(ledgeSize); memcpy(ledges, ledgeData, ledgeSize); for(int i=0; i < bsp->numFaces; i++){ // Read all verts from edge data into a vert data structure // that is more suitable for GL rendering Face *face = &bsp->faces[i]; face->numVerts = faces[i].edgeNum; face->verts = malloc(sizeof(Vert)*face->numVerts); TexInfoDef *texInfo = getTexInfo(bsp, faces[i].texinfoId); face->texture = getTexture(bsp, texInfo->texId); face->glId = 0; // If face is a trigger or clip skip loading it's verts // TODO make somekind of stack or vector to store faces so we don't bother // allocating useless memory if(strcmp("trigger", getTexName(face->texture)) == 0 || strcmp("clip", getTexName(face->texture)) == 0){ continue; } for(int edge=0; edge < faces[i].edgeNum; edge++){ int32_t edgeIndex = ledges[edge+faces[i].edgeId]; vec3Float verts[2]; // if edgeIndex is negative flip v0 and v1 if(edgeIndex < 0){ edgeIndex = -edgeIndex; verts[0] = getVert(bsp, edges[edgeIndex].vert1); verts[1] = getVert(bsp, edges[edgeIndex].vert0); } else { verts[0] = getVert(bsp, edges[edgeIndex].vert0); verts[1] = getVert(bsp, edges[edgeIndex].vert1); } face->verts[edge].normal = getPlane(bsp, faces[i].planeId)->normal; // Negate y and flip y & z so it's oriented properly face->verts[edge].position.x = verts[0].x; face->verts[edge].position.y = verts[0].z; face->verts[edge].position.z = -verts[0].y; // compute s and t coordinate for texture mapping face->verts[edge].texCoord.x = (vec3FDot(&verts[0], &texInfo->vecS) + texInfo->distS) / getTexWidth(face->texture); face->verts[edge].texCoord.y = (vec3FDot(&verts[0], &texInfo->vecT) + texInfo->distT) / getTexHeight(face->texture); } // Now that we have loaded all vertex data for this face // We can generate a vbo for it glGenBuffers(1, &face->glId); glBindBuffer(GL_ARRAY_BUFFER, face->glId); glBufferData(GL_ARRAY_BUFFER, sizeof(Vert)*face->numVerts, &face->verts[0], GL_STATIC_DRAW); } free(faces); free(edges); free(ledges); }
Animation::Animation(const std::string& id, const std::string& imageFile, int cellSize, int frameCount) : GUIImage(id, imageFile, Vector2((float) cellSize, (float) cellSize)) { p_frameCounts = new int {frameCount}; tilePercentage.set((float) cellSize / getTexWidth(), (float) cellSize / getTexHeight()); }