UVMapT *NewUVMapFromFile(const char *fileName) { DiskUVMapT *file = (DiskUVMapT *)ReadFileSimple(fileName); if (file) { UVMapT *map = NewUVMap(file->width, file->height, UV_FAST, 256, 256); LOG("Distortion map '%s' has size (%d,%d).", fileName, (int)file->width, (int)file->height); { uint8_t *dstU = map->map.fast.u; uint8_t *dstV = map->map.fast.v; uint8_t *src = file->data; int n = map->width * map->height; do { *dstU++ = *src++; *dstV++ = *src++; } while (--n); } MemUnref(file); return map; } return NULL; }
MeshT *NewMeshFromFile(const char *fileName) { DiskMeshT *header = ReadFileSimple(fileName); if (header) { MeshT *mesh = NewMesh(header->vertices, header->polygons, header->surfaces); uint8_t *data = header->data; int i; /* vertices */ MemCopy(mesh->vertex, data, sizeof(Vector3D) * header->vertices); for (i = 0; i < header->vertices; i++) { mesh->vertex[i].y = - mesh->vertex[i].y; mesh->vertex[i].z = - mesh->vertex[i].z; } data += sizeof(Vector3D) * header->vertices; /* triangles */ for (i = 0; i < header->polygons; i++) { DiskTriangleT *triangle = (DiskTriangleT *)data; mesh->polygon[i].surface = triangle->surface; mesh->polygon[i].p[0] = triangle->p[0]; mesh->polygon[i].p[1] = triangle->p[1]; mesh->polygon[i].p[2] = triangle->p[2]; data += sizeof(DiskTriangleT); } MeshCalculateEdges(mesh); /* surfaces */ for (i = 0; i < header->surfaces; i++) { DiskSurfaceT *surface = (DiskSurfaceT *)data; mesh->surface[i].name = StrDup(surface->name); mesh->surface[i].color.rgb = surface->color; mesh->surface[i].sideness = surface->flags; data += sizeof(DiskSurfaceT) + strlen(surface->name) + 1; } LOG("Mesh '%s' has %d vertices, %d polygons, %d edges " "and %d surfaces.", fileName, mesh->vertexNum, mesh->polygonNum, mesh->edgeNum, mesh->surfaceNum); MemUnref(header); CalculateVertexToPolygonMap(mesh); return mesh; } return NULL; }
PaletteT *NewPaletteFromFile(const StrT fileName) { DiskPaletteT *file = ReadFileSimple(fileName); if (file) { PaletteT *palette = NewPalette(file->count); palette->start = file->start; LOG("Palette '%s' has %d colors.", fileName, file->count); MemCopy(palette->colors, file->colors, sizeof(RGB) * file->count); MemUnref(file); return palette; } return NULL; }
DistortionMapT *NewDistortionMapFromFile(const StrT fileName) { DiskDistortionMapT *file = (DiskDistortionMapT *)ReadFileSimple(fileName); if (file) { DistortionMapT *map = NewDistortionMap(file->width, file->height, DMAP_OPTIMIZED, 256, 256); LOG("Distortion map '%s' has size (%d,%d).", fileName, (int)file->width, (int)file->height); memcpy(map->map, file->data, (int)file->width * (int)file->height * sizeof(uint16_t)); MemUnref(file); return map; } return NULL; }