GENERATE_INTERCEPT_HEADER(D3DXCreateTextureFromFileInMemoryEx, HRESULT, WINAPI, LPDIRECT3DDEVICE9 pDevice, LPCVOID pSrcData, UINT SrcDataSize, UINT Width, UINT Height, UINT MipLevels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, DWORD Filter, DWORD MipFilter, D3DCOLOR ColorKey, D3DXIMAGE_INFO *pSrcInfo, PALETTEENTRY *pPalette, LPDIRECT3DTEXTURE9 *ppTexture) { SDLOG(4, "DetouredD3DXCreateTextureFromFileInMemoryEx: \n -- pDevice %p, pSrcData %p, SrcDataSize %u, Width %u, Height %u, MipLevels %u, Usage %d, Format %s\n", pDevice, pSrcData, SrcDataSize, Width, Height, MipLevels, Usage, D3DFormatToString(Format)); if(!RSManager::exists()) return TrueD3DXCreateTextureFromFileInMemoryEx(pDevice, pSrcData, SrcDataSize, Width, Height, MipLevels, Usage, Format, Pool, Filter, MipFilter, ColorKey, pSrcInfo, pPalette, ppTexture); if(SrcDataSize == 4294967295u && Width == 4294967295u && Height == 4294967295u) { D3DSURFACE_DESC d = getTexInfo(pDevice, pSrcData); Width = d.Width; Height = d.Height; } HRESULT res = RSManager::getDX9().redirectD3DXCreateTextureFromFileInMemoryEx(pDevice, pSrcData, SrcDataSize, Width, Height, MipLevels, Usage, Format, Pool, Filter, MipFilter, ColorKey, pSrcInfo, pPalette, ppTexture); if(SrcDataSize == 2147483647u || SrcDataSize == 4294967295u) SrcDataSize = Width*Height / 2; RSManager::getDX9().registerD3DXCreateTextureFromFileInMemory(pSrcData, SrcDataSize, *ppTexture); return res; }
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); }