From 90e54835d3b47c09bf4bded33bdc18363ff1bfe7 Mon Sep 17 00:00:00 2001 From: Dmitry Prikhodko Date: Sun, 29 Dec 2024 13:24:34 +0200 Subject: [PATCH] Initial release --- .gitignore | 3 + CMakeLists.txt | 7 + README.md | 101 +++++++ app.ico | Bin 0 -> 3286 bytes app.rc | 3 + main.c | 769 +++++++++++++++++++++++++++++++++++++++++++++++++ mesh.c | 331 +++++++++++++++++++++ mesh.h | 26 ++ screenshot.png | Bin 0 -> 95309 bytes texture.c | 74 +++++ texture.h | 15 + 11 files changed, 1329 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 README.md create mode 100644 app.ico create mode 100644 app.rc create mode 100644 main.c create mode 100644 mesh.c create mode 100644 mesh.h create mode 100644 screenshot.png create mode 100644 texture.c create mode 100644 texture.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..de10fa5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.idea/ +cmake-build-*/ +test/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..d7197bb --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,7 @@ +cmake_minimum_required(VERSION 3.26) +project(pathologic_mesh_viewer C) + +set(CMAKE_C_STANDARD 11) + +add_executable(pathologic_mesh_viewer WIN32 main.c mesh.c texture.c app.rc) +target_link_libraries(pathologic_mesh_viewer Shlwapi.lib Windowscodecs) \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8c92f60 --- /dev/null +++ b/README.md @@ -0,0 +1,101 @@ +# Pathologic Mesh Viewer + +A 3D model viewer for Pathologic Classic HD that supports the .mesh file format used in the game. + +Pathologic + +This tool makes possible to load and explore the game's 3D assets. + +> **Note:** Pathologic Mesh Viewer is still under development and may not fully support every `.mesh` file from the game. + +## How to Use + +1. **Download or Build the Viewer** + - Download a prebuilt version or build the project from the source code. + +2. **Prepare the Game Assets** + - Extract `Geometries.vfs` and `Textures.vfs` archives located in game data folder. + +3. **Open a Model** + - Use Pathologic Mesh Viewer to open any `.mesh` file from the extracted assets. + +--- + +## Specification + +### .mesh file structure (NOT COMPLETE) +See `mesh.c` for details. +``` +struct { + unsigned int model_type_or_submesh_count; + if (model_type_or_submesh_count == 0) { + unsigned int submesh_count; // read value again if previous was 0 + } + + struct { + unsigned int unknown1; + unsigned int unknown2; + if (unknown2 == 1) { + unsigned char unknown3; // if "unknown2 == 1" than there are 1 byte value + } + + unsigned char texture_name_length; + char texture_name[texture_name_length]; + unsigned char unknown4; // probably "texture has alpha channel" flag + + if (unknown2 == 5) { + float unknown5[4]; // if "unknown2 == 5" than there are 4 float values + } + + unsigned int vertices_count; + unsigned int indices_count; + + float unknown_floats[19]; // there are always 19 float values here, but their purpose is unknown + + if (model_type_or_submesh_count == 0) { + int unknown_blocks_count; + struct { + int block_unknown1; + float block_unknown2[15]; + int block_unknown3; + if (block_unknown3 == 1) { + int block_unknown4; + int block_unknown5; + int block_unknown6; + char block_unknown7[block_unknown6]; + int block_unknown8; + char block_unknown9[block_unknown8]; + int block_unknown10; + int block_unknown11; + struct { + short subblock_unknown1[4]; + } unknown_subblocks[block_unknown11]; + float block_unknown12; + } + } unknown_blocks[unknown_blocks_count]; + } + + } submesh_info[submesh_count]; + + unsgined char unknown[13]; // unknown 13 bytes + + struct { + struct { + short x; + short y; + short z; + char unknown[4]; // unknown 4 bytes + float u; + float v; + } vertices[vertices_count]; + + struct { + short v1; + short v2; + short v3; + } indices[indices_count]; + + } submeshes[submesh_count]; +} mesh; +``` + diff --git a/app.ico b/app.ico new file mode 100644 index 0000000000000000000000000000000000000000..920d6151df6b0c63da1559d7c51e2647e0f556e5 GIT binary patch literal 3286 zcmd5;cT}R;6~CKgvzxx@lfG%2o@{!ro3iQ2ZZKt)kO1;hdf zs30ohprd0$Km^@4N55``-7;y%*pycmq83 z6d-*P!X5{B1^~{SIccAP=br#zpzQM~Llt-$aiaHnB|h{lB;2?FiLabPdJ$4@T|iud zv^$p}Gv+E}M2A35LO4*9LV=e2G9n!EQ$wI2H5`~3H=ux=g!B#~8j7<+fR%j%3NsU+ zG&dYrIq^`ElL)2M7+}*VPbLlr1Q98kC9Kxa!HXcP=+lQv*KAG+J9NX5|I&V*h~4))bS zr$T~M0(}|=Jh(^0zG~36)gYgTyaakXaa?;N40IQw4j+0tWC%I*s2gFhhmCR$+*db2 zzm|to0mfl6==#cWTn8A3m@qa%1JiIR>Z%ZJFm6i2FhF&1vWOQuDbtF2VLR__u0dYeRxu)og(f?&Yjo)Fen77#Aj3rfJ_c7gX1mf-NP7QAaqh-ElBu0j189H+vyts>lT zc+`S232gY*U=u+Q&4?B_I_f~$f$Q}l?ZmaNmHGHhPn+ZaJKT7ohWd--i#u+X0jS_p!J56Ys+M7F-Gi z$piQdgnZ;J@J;9ecoTpQ-UGk=PE_f&&+-L7d*X+~hM0G}^rtS;2Osmx&-dhF9bdhbsd7r*qIj<yf>$xd)YNR&s1m-645#z8Ii;!`=f z!SLuFKho}O;UaCQq=~9>YS?7t+oXJ~)y;K{eAf7=z`xZ%5ViOww*7eK=&&hRPfv_( zZFrH{@Ve2a%`{xkWnfb($i-UQexf6;W@3F>2%>s-x9VT56Us=7d2Q3{UUE9dJDTu! z(og06TGlC(mlBQ)I^)gF6u-YB5NNsQOp4(C-KnZVA;aLV0lDk%>c+$G$B;;fi_QY4)mQJ8tF zr6C0aV0PTKPDP?;EoF0q;&D^mtC`!|w1dOSKmb4dM+re_xBV(scDS}py1nIdIURMJ zf>LS%BmGuJ^fe5V8bt>A_7&S$!Qml25MWtH>4h0#jI>wS)QI6eN-$U&2=IbI>A`_w z=b@r7Gh9}~o^yF0VYJIr z2tpj(6}g$;Ia5wm@EQ@jAo=SeNwcNj1MG!)l zlc|y>mgI($ZeB=*a&2?OjvTUHcQdmZ3Wyj_wUC)lY>YNts1vLe!p+%JN z{XJzcpa|@=93RUYDr4h9&S84PriB@Gaq_w-dU{k@eu73J8t888>1b(}izK{4R!%|z z`DNEU_u;l0*On0a5|m4Min6sfC%58{Wn#TV-EK5wqihmX2I-CS=Q(|PcHO^@pb`lf97mia3#A(xSkr(hf7 z5yZWc+=!T~FX|o?kMuLMEwjY7OKUV zS3!@$$*!u^Rfu1~Zb-6}a->+>|imT=vEVDtPZk8y-ypCo8W_*B + +1 ICON "app.ico" \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..ef3094b --- /dev/null +++ b/main.c @@ -0,0 +1,769 @@ +#include +#include +#define _USE_MATH_DEFINES +#include +#include + +#include "mesh.h" + +// Window menu +#define MENU_ITEM_ID_DRAW_WIREFRAME 1 +#define MENU_ITEM_ID_DRAW_POINTS 2 +#define MENU_ITEM_ID_DRAW_FACES 3 +#define MENU_ITEM_ID_DRAW_TEXTURE 4 +#define MENU_ITEM_ID_OPEN 10 +#define MENU_ITEM_ID_EXIT 20 +#define MENU_ITEM_ID_HELP 30 +HMENU g_menu; + +// Screen buffer +const int g_screen_width = 800; +const int g_screen_height = 600; +DWORD *g_screen_color; +float *g_screen_depth; + +// Rendering variables +float g_screen_dimension; +float g_screen_dimension_offset_x; +float g_screen_dimension_offset_y; + +// Camera variables +float g_camera_x = 0.0f; +float g_camera_y = 0.0f; +float g_camera_z = 0.0f; +float g_camera_rot = 0.0f; +float g_camera_yaw = 0.0f; + +// Loaded mesh +Mesh g_mesh; +BOOL g_mesh_loaded = FALSE; + +static void DrawPoint_Unsafe(int x, int y, float z, DWORD color) +{ + int index = (y * g_screen_width) + x; + float z_inv = 1.0f / z; + if (z_inv >= g_screen_depth[index]) { + g_screen_color[index] = color; + g_screen_depth[index] = z_inv; + } +} + +static void DrawPoint(int x, int y, float z, DWORD color) +{ + if (x >= 0 && x < g_screen_width && y >= 0 && y < g_screen_height) { + DrawPoint_Unsafe(x, y, z, color); + } +} + +BOOL ClipLine(int *x1, int *y1, int *x2, int *y2, int x_min, int y_min, int x_max, int y_max) +{ + // Clipping parameters + float a = 0.0f; + float b = 1.0f; + + // Calculate line direction + float dx = (float)(*x2 - *x1); + float dy = (float)(*y2 - *y1); + + // Compute directions and distances vectors for the four clipping boundaries + float p[4]; + p[0] = -dx; + p[1] = dx; + p[2] = -dy; + p[3] = dy; + + float q[4]; + q[0] = (float)(*x1 - x_min); + q[1] = (float)(x_max - *x1); + q[2] = (float)(*y1 - y_min); + q[3] = (float)(y_max - *y1); + + // Update u1 and u2 based on the clipping boundaries + for (int i = 0; i < 4; i++) { + if (p[i] == 0) { + if (q[i] < 0) { + return FALSE; // line is parallel and outside the clipping edge + } + } else { + float r = q[i] / p[i]; // ratio of the distances + if (p[i] < 0) { + if (r > a) { a = r; } + } else { + if (r < b) { b = r; } + } + } + } + + // Check if line is outside the clipping region + if (a > b) { + return FALSE; // line is outside + } + + // Update points based on the clipped values + if (b < 1.0) { + *x2 = *x1 + (int)roundf(dx * b); + *y2 = *y1 + (int)roundf(dy * b); + } + if (a > 0.0) { + *x1 = *x1 + (int)roundf(dx * a); + *y1 = *y1 + (int)roundf(dy * a); + } + return TRUE; // line is within the clipping region +} + +void DrawLine_Unsafe(int x1, int y1, int x2, int y2, DWORD color) +{ + // Calculate the absolute difference + int dx = abs(x2 - x1); + int dy = -abs(y2 - y1); + + // In which direction coordinates should move, either up (-1) or down (1) + int sx = x1 < x2 ? 1 : -1; + int sy = y1 < y2 ? 1 : -1; + + int error = dx + dy; + + // Loop until the current point (x1, y1) reaches the endpoint (x2, y2) + while (1) { + + // Plot pixel + int i = y1 * g_screen_width + x1; + g_screen_color[i] = color; + g_screen_depth[i] = FLT_MAX; + + // Is destination point reached? + if (x1 == x2 && y1 == y2) { + break; + } + + // Depending on the error value, either move horizontally, vertically, or both + int e2 = error * 2; + if (e2 >= dy) { error += dy; x1 += sx; } + if (e2 <= dx) { error += dx; y1 += sy; } + } +} + +static void DrawLine(int x1, int y1, int x2, int y2, DWORD color) +{ + // Clip line inside screen bounds + if (ClipLine(&x1, &y1, &x2, &y2, 0, 0, g_screen_width-1, g_screen_height-1) == FALSE) { + return; // line is outside, nothing to draw + } + + // Draw clipped line + DrawLine_Unsafe(x1, y1, x2, y2, color); +} + +void DrawTriangle(Texture texture, + float ax, float ay, float z1, float u1, float v1, + float bx, float by, float z2, float u2, float v2, + float cx, float cy, float z3, float u3, float v3) +{ + if (texture.width == 0 || texture.height == 0) { return; } // safety check + + const int x1 = (int)ax; + const int y1 = (int)ay; + const int x2 = (int)bx; + const int y2 = (int)by; + const int x3 = (int)cx; + const int y3 = (int)cy; + + // Find triangle bounds + int min_x = (x1 < x2) ? ( (x1 < x3) ? x1 : x3 ) : ( (x2 < x3) ? x2 : x3 ); + int min_y = (y1 < y2) ? ( (y1 < y3) ? y1 : y3 ) : ( (y2 < y3) ? y2 : y3 ); + int max_x = (x1 > x2) ? ( (x1 > x3) ? x1 : x3 ) : ( (x2 > x3) ? x2 : x3 ); + int max_y = (y1 > y2) ? ( (y1 > y3) ? y1 : y3 ) : ( (y2 > y3) ? y2 : y3 ); + + // Clip to the screen + if (min_x < 0) { min_x = 0; } + if (max_x > g_screen_width) { max_x = g_screen_width; } + if (min_y < 0) { min_y = 0; } + if (max_y > g_screen_height) { max_y = g_screen_height; } + + // Set up edge functions + const int a12 = y2 - y3; + const int b12 = x3 - x2; + const int a23 = y3 - y1; + const int b23 = x1 - x3; + const int a31 = y1 - y2; + const int b31 = x2 - x1; + + float w1_row = a12 * (min_x - x3) + b12 * (min_y - y3); + float w2_row = a23 * (min_x - x1) + b23 * (min_y - y1); + float w3_row = a31 * (min_x - x2) + b31 * (min_y - y2); + + // Precompute the inverse of the triangle's area + const float area = ((y2 - y3) * (x1 - x3) + (x3 - x2) * (y1 - y3)); + if (area == 0) { + return; // nothing to draw + } + const float area_inv = 1.0f / area; + + const float z1_inv = 1.0f / z1; + const float z2_inv = 1.0f / z2; + const float z3_inv = 1.0f / z3; + + for (int y = min_y; y < max_y; y++) { + + // Barycentric coordinates at the start of the row + float w1 = w1_row; + float w2 = w2_row; + float w3 = w3_row; + + for (int x = min_x; x < max_x; x++) { + + // If p is on the right side of all three edges, render pixel + if (w1 >= 0 && w2 >= 0 && w3 >= 0) { + + const size_t i = (y * g_screen_width) + x; + + // Interpolate triangle coordinates using barycentric coordinates + const float a = w1 * area_inv; + const float b = w2 * area_inv; + const float c = w3 * area_inv; + + // Interpolate depth + const float z = (a * z1_inv) + (b * z2_inv) + (c * z3_inv); + if (z > g_screen_depth[i]) { // Test depth + + // Interpolate texture coordinates + float u = (u1 * a * z1_inv + u2 * b * z2_inv + u3 * c * z3_inv) / z; + float v = (v1 * a * z1_inv + v2 * b * z2_inv + v3 * c * z3_inv) / z; + + // Wrap texture coordinates to make the texture repeatable + u = u - floorf(u); + v = v - floorf(v); + + int tx = (int)(u * (float)texture.width); + int ty = (int)(v * (float)texture.height); + int tw = (int)texture.width - 1; + int th = (int)texture.height - 1; + tx = tx < 0 ? 0 : (tx > tw ? tw : tx); + ty = ty < 0 ? 0 : (ty > th ? th : ty); + DWORD color = texture.data[(ty * texture.width) + tx]; + + g_screen_color[i] = color; + g_screen_depth[i] = z; + } + } + + // Move to the next pixel + w1 += a12; + w2 += a23; + w3 += a31; + } + + // Move to the next scanline + w1_row += b12; + w2_row += b23; + w3_row += b31; + } +} + +void CalculateBounds() +{ + float min_x = 1000.0f, min_y = 1000.0f, min_z = 1000.0f; + float max_x = -1000.0f, max_y = -1000.0f, max_z = -1000.0f; + for (int i = 0; i < g_mesh.triangle_count; ++i) { + MeshTriangle triangle = g_mesh.triangles[i]; + MeshPoint a = g_mesh.points[triangle.a]; + MeshPoint b = g_mesh.points[triangle.b]; + MeshPoint c = g_mesh.points[triangle.c]; + min_x = min(min_x, a.x); + min_x = min(min_x, b.x); + min_x = min(min_x, c.x); + min_y = min(min_y, a.y); + min_y = min(min_y, b.y); + min_y = min(min_y, c.y); + min_z = min(min_y, a.z); + min_z = min(min_y, b.z); + min_z = min(min_y, c.z); + max_x = max(max_x, a.x); + max_x = max(max_x, b.x); + max_x = max(max_x, c.x); + max_y = max(max_y, a.y); + max_y = max(max_y, b.y); + max_y = max(max_y, c.y); + max_z = max(max_y, a.z); + max_z = max(max_y, b.z); + max_z = max(max_y, c.z); + } + + float bounds = fabsf(max_x); + bounds = max(bounds, fabsf(min_x)); + bounds = max(bounds, fabsf(max_y)); + bounds = max(bounds, fabsf(min_y)); + bounds = max(bounds, fabsf(max_z)); + bounds = max(bounds, fabsf(min_z)); + + g_camera_x = 0; + g_camera_y = 0; + g_camera_z = bounds * 3; + g_camera_rot = 0; + g_camera_yaw = 0; +} + +void TryLoadMesh(HWND window, const char *path) +{ + g_mesh_loaded = Mesh_LoadFromPathologicFormat(&g_mesh, path); + if (!g_mesh_loaded) { + MessageBox( + window, + TEXT("An error occurred while trying to load the selected model. Please note that Pathologic Mesh Viewer is still under development and may fail to load some game meshes."), + TEXT("Failed to load .mesh file"), + MB_OK | MB_ICONWARNING + ); + return; + } + CalculateBounds(); +} + +static void Point_Rotate(float *x, float *y, float sin, float cos) +{ + float rx = (*x) * cos - (*y) * sin; + float ry = (*x) * sin + (*y) * cos; + *x = rx; + *y = ry; +} + +void Window_DrawViewport(BOOL draw_wireframe, BOOL draw_points, BOOL draw_faces, BOOL draw_texture) +{ + // Precompute screen-related values + g_screen_dimension = min(g_screen_width, g_screen_height); + g_screen_dimension_offset_x = (g_screen_width - g_screen_dimension) / 2; + g_screen_dimension_offset_y = (g_screen_height - g_screen_dimension) / 2; + + // Clear buffers + for (int i = 0; i < g_screen_width * g_screen_height; ++i) { + g_screen_color[i] = 0x393029; + } + for (int i = 0; i < g_screen_width * g_screen_height; ++i) { + g_screen_depth[i] = 0.0f; + } + + if (!g_mesh_loaded) { + return; // nothing to draw + } + + float mesh_rot_cos = cosf(g_camera_rot); + float mesh_rot_sin = sinf(g_camera_rot); + float mesh_yaw_cos = cosf(g_camera_yaw); + float mesh_yaw_sin = sinf(g_camera_yaw); + + if (draw_texture) { + if (g_mesh.texture_count > 0) { + Texture texture = g_mesh.textures[0]; + + for (int y = 0; y < texture.height; ++y) { + int sy = y/2; + if (sy < 0 || sy >= g_screen_height) { continue; } + for (int x = 0; x < texture.width; ++x) { + int sx = x/2; + if (sx < 0 || sx >= g_screen_width) { continue; } + g_screen_color[sy * g_screen_width + sx] = texture.data[y * texture.width + x]; + } + } + } + } + + // Render mesh wireframe + for (int i = 0; i < g_mesh.triangle_count; ++i) { + MeshTriangle t = g_mesh.triangles[i]; + MeshPoint a = g_mesh.points[t.a]; + MeshPoint b = g_mesh.points[t.b]; + MeshPoint c = g_mesh.points[t.c]; + + float ax = a.x; + float ay = a.y; + float az = a.z; + ay *= -1; + float bx = b.x; + float by = b.y; + float bz = b.z; + by *= -1; + float cx = c.x; + float cy = c.y; + float cz = c.z; + cy *= -1; + + // Model-space rotation + Point_Rotate(&ax, &az, mesh_rot_sin, mesh_rot_cos); + Point_Rotate(&bx, &bz, mesh_rot_sin, mesh_rot_cos); + Point_Rotate(&cx, &cz, mesh_rot_sin, mesh_rot_cos); + + Point_Rotate(&ay, &az, mesh_yaw_sin, mesh_yaw_cos); + Point_Rotate(&by, &bz, mesh_yaw_sin, mesh_yaw_cos); + Point_Rotate(&cy, &cz, mesh_yaw_sin, mesh_yaw_cos); + + // Model-space transform + ax += g_camera_x; + ay += g_camera_y; + az += g_camera_z; + bx += g_camera_x; + by += g_camera_y; + bz += g_camera_z; + cx += g_camera_x; + cy += g_camera_y; + cz += g_camera_z; + + // Perspective divide + ax /= az; + ay /= az; + bx /= bz; + by /= bz; + cx /= cz; + cy /= cz; + + // Backface culling + if (az <= 0) { continue; } + if (bz <= 0) { continue; } + if (cz <= 0) { continue; } + + // Screen-space transform (remap from [-0.5, 0.5] to [0, screen_dimension] + ax = (0.5f + ax) * g_screen_dimension + g_screen_dimension_offset_x; + ay = (0.5f + ay) * g_screen_dimension + g_screen_dimension_offset_y; + bx = (0.5f + bx) * g_screen_dimension + g_screen_dimension_offset_x; + by = (0.5f + by) * g_screen_dimension + g_screen_dimension_offset_y; + cx = (0.5f + cx) * g_screen_dimension + g_screen_dimension_offset_x; + cy = (0.5f + cy) * g_screen_dimension + g_screen_dimension_offset_y; + + if (draw_faces) { + DrawTriangle(g_mesh.textures[0], + ax, ay, az, a.u, a.v, + bx, by, bz, b.u, b.v, + cx, cy, cz, c.u, c.v); + } + if (draw_wireframe) { + DrawLine(ax, ay, bx, by, 0x66FF66); + DrawLine(bx, by, cx, cy, 0x66FF66); + DrawLine(cx, cy, ax, ay, 0x66FF66); + } + } + + // Render mesh points + if (draw_points) { + for (int i = 0; i < g_mesh.point_count; ++i) { + MeshPoint *point = &g_mesh.points[i]; + + float x = point->x; + float y = point->y; + float z = point->z; + y *= -1; + + // Model-space rotation + Point_Rotate(&x, &z, mesh_rot_sin, mesh_rot_cos); + Point_Rotate(&y, &z, mesh_yaw_sin, mesh_yaw_cos); + + // Model-space transform + x += g_camera_x; + y += g_camera_y; + z += g_camera_z; + + // Culling + if (z <= 0) { + continue; + } + + // Perspective divide + x /= z; + y /= z; + + // Screen-space transform (remap from [-0.5, 0.5] to [0, screen_dimension] + x = (0.5f + x) * g_screen_dimension + g_screen_dimension_offset_x; + y = (0.5f + y) * g_screen_dimension + g_screen_dimension_offset_y; + + // Draw points + DrawPoint(x, y, z, 0xFF0000); + } + } +} + +BOOL FileSelectDialog_Show(OUT char *result, int result_max, HWND parent, LPCSTR filter) +{ + OPENFILENAME dialog_params; + ZeroMemory(&dialog_params, sizeof(OPENFILENAME)); + dialog_params.lStructSize = sizeof(OPENFILENAME); + dialog_params.hwndOwner = parent; + dialog_params.lpstrFile = result; + dialog_params.nMaxFile = result_max; + dialog_params.lpstrFilter = filter; + dialog_params.Flags = OFN_PATHMUSTEXIST; + return GetOpenFileName(&dialog_params); +} + +static BOOL WindowMenu_IsItemChecked(HMENU menu, UINT menu_item_id) +{ + return (GetMenuState(menu, menu_item_id, MF_BYCOMMAND) & MF_CHECKED) == MF_CHECKED; +} + +static void WindowMenu_ToggleItem(HMENU menu, UINT menu_item_id) +{ + BOOL checked = WindowMenu_IsItemChecked(menu, menu_item_id); + CheckMenuItem(menu, menu_item_id, MF_BYCOMMAND | (!checked ? MF_CHECKED : MF_UNCHECKED)); +} + +BOOL Window_Create(HWND window) +{ + // Initialize buffers + g_screen_color = HeapAlloc(GetProcessHeap(), 0, g_screen_width * g_screen_height * sizeof(DWORD)); + if (!g_screen_color) { + return FALSE; + } + g_screen_depth = HeapAlloc(GetProcessHeap(), 0, g_screen_width * g_screen_height * sizeof(float)); + if (!g_screen_depth) { + return FALSE; + } + + // Create menu + g_menu = CreateMenu(); + HMENU menu_file = CreatePopupMenu(); + AppendMenu(menu_file, MF_STRING, MENU_ITEM_ID_OPEN, "&Open..."); + AppendMenu(menu_file, MF_SEPARATOR, 0, NULL); + AppendMenu(menu_file, MF_STRING, MENU_ITEM_ID_EXIT, TEXT("E&xit")); + AppendMenu(g_menu, MF_POPUP, (UINT_PTR)menu_file, "File"); + HMENU menu_view = CreatePopupMenu(); + AppendMenu(menu_view, MF_STRING, MENU_ITEM_ID_DRAW_WIREFRAME, "Draw wireframe\tF2"); + AppendMenu(menu_view, MF_STRING | MF_CHECKED, MENU_ITEM_ID_DRAW_POINTS, "Draw points\tF3"); + AppendMenu(menu_view, MF_STRING | MF_CHECKED, MENU_ITEM_ID_DRAW_FACES, "Draw faces\tF4"); + AppendMenu(menu_view, MF_STRING, MENU_ITEM_ID_DRAW_TEXTURE, "Draw texture preview\tF5"); + AppendMenu(g_menu, MF_POPUP, (UINT_PTR)menu_view, "View"); + HMENU menu_help = CreatePopupMenu(); + AppendMenu(menu_help, MF_STRING, MENU_ITEM_ID_HELP, "Help\tF1"); + AppendMenu(g_menu, MF_POPUP, (UINT_PTR)menu_help, "View"); + SetMenu(window, g_menu); + + // Allow to drag and drop files to window + DragAcceptFiles(window, TRUE); + + return TRUE; +} + +void ShowHelp(HWND window) +{ + MessageBox(window, TEXT("For the latest updates, visit: https://github.com/koshkokoshka/pathologic-mesh-viewer"), TEXT("Help"), MB_OK | MB_ICONINFORMATION); +} + +void Window_OnKeyDown(HWND window, WPARAM w_param) +{ + switch (w_param) { + case VK_F1: ShowHelp(window); break; + case VK_F2: WindowMenu_ToggleItem(g_menu, MENU_ITEM_ID_DRAW_WIREFRAME); break; + case VK_F3: WindowMenu_ToggleItem(g_menu, MENU_ITEM_ID_DRAW_POINTS); break; + case VK_F4: WindowMenu_ToggleItem(g_menu, MENU_ITEM_ID_DRAW_FACES); break; + case VK_F5: WindowMenu_ToggleItem(g_menu, MENU_ITEM_ID_DRAW_TEXTURE); break; + default: return; // do not redraw window + } + RedrawWindow(window, NULL, NULL, RDW_INVALIDATE); +} + +void Window_OnCommand(HWND window, WPARAM w_param) +{ + switch (w_param) { + case MENU_ITEM_ID_DRAW_WIREFRAME: + case MENU_ITEM_ID_DRAW_POINTS: + case MENU_ITEM_ID_DRAW_FACES: + case MENU_ITEM_ID_DRAW_TEXTURE: + WindowMenu_ToggleItem(g_menu, w_param); + RedrawWindow(window, NULL, NULL, RDW_INVALIDATE); + break; + case MENU_ITEM_ID_OPEN: + TCHAR path[MAX_PATH]; + path[0] = '\0'; + if (FileSelectDialog_Show(path, sizeof(path), window, "Pathologic 3D mesh data (.mesh)\0*.mesh\0\0")) { + TryLoadMesh(window, path); + } + RedrawWindow(window, NULL, NULL, RDW_INVALIDATE); + break; + case MENU_ITEM_ID_EXIT: + PostQuitMessage(0); + break; + case MENU_ITEM_ID_HELP: + ShowHelp(window); + break; + } +} + +void Window_OnMouseWheel(HWND window, WPARAM w_param) +{ + float delta = (float)GET_WHEEL_DELTA_WPARAM(w_param) / WHEEL_DELTA; + g_camera_z = g_camera_z * powf(0.95f, delta); + RedrawWindow(window, NULL, NULL, RDW_INVALIDATE); +} + +void Window_OnLeftMouseDown(HWND window) +{ + SetCapture(window); +} + +void Window_OnLeftMouseUp(HWND window) +{ + ReleaseCapture(); +} + +void Window_OnMouseMove(HWND window, LPARAM l_param) +{ + static int g_mouse_x; + static int g_mouse_y; + + int x = GET_X_LPARAM(l_param); + int y = GET_Y_LPARAM(l_param); + if (GetCapture() == window) { + g_camera_rot += (float)(x - g_mouse_x) * 0.01f; + g_camera_yaw += (float)(y - g_mouse_y) * 0.01f; + RedrawWindow(window, NULL, NULL, RDW_INVALIDATE); + } + g_mouse_x = x; + g_mouse_y = y; +} + +void Window_OnDropFiles(HWND window, WPARAM w_param) +{ + HDROP drop = (HDROP)w_param; + TCHAR path[MAX_PATH]; + if (DragQueryFile(drop, 0, path, MAX_PATH) != 0) { + TryLoadMesh(window, path); + } + DragFinish(drop); + RedrawWindow(window, NULL, NULL, RDW_INVALIDATE); +} + +void Window_OnPaint(HWND window) +{ + PAINTSTRUCT ps; + BeginPaint(window, &ps); + + BOOL draw_wireframe = WindowMenu_IsItemChecked(g_menu, MENU_ITEM_ID_DRAW_WIREFRAME); + BOOL draw_points = WindowMenu_IsItemChecked(g_menu, MENU_ITEM_ID_DRAW_POINTS); + BOOL draw_faces = WindowMenu_IsItemChecked(g_menu, MENU_ITEM_ID_DRAW_FACES); + BOOL draw_texture = WindowMenu_IsItemChecked(g_menu, MENU_ITEM_ID_DRAW_TEXTURE); + Window_DrawViewport(draw_wireframe, draw_points, draw_faces, draw_texture); + + BITMAPINFO bmi; + ZeroMemory(&bmi, sizeof(BITMAPINFO)); + bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bmi.bmiHeader.biWidth = g_screen_width; + bmi.bmiHeader.biHeight = -g_screen_height; + bmi.bmiHeader.biPlanes = 1; + bmi.bmiHeader.biBitCount = 32; + bmi.bmiHeader.biCompression = BI_RGB; + StretchDIBits(ps.hdc, + ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom, + ps.rcPaint.left, ps.rcPaint.top, ps.rcPaint.right, ps.rcPaint.bottom, + g_screen_color, &bmi, DIB_RGB_COLORS, SRCCOPY); + + if (!g_mesh_loaded) { + SelectObject(ps.hdc, GetStockObject(DEFAULT_GUI_FONT)); + RECT client_rect; + GetClientRect(window, &client_rect); + DrawText(ps.hdc, TEXT("Select Pathologic .mesh with File -> Open..."), -1, &client_rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); + } + + EndPaint(window, &ps); +} + +LRESULT CALLBACK Window_Process(HWND window, UINT message, WPARAM w_param, LPARAM l_param) +{ + switch (message) { + case WM_CREATE: + if (!Window_Create(window)) { + PostQuitMessage(1); + return 1; + } + return 0; + + case WM_DESTROY: + PostQuitMessage(0); + return 0; + + case WM_COMMAND: + Window_OnCommand(window, w_param); + return 0; + + case WM_KEYDOWN: + Window_OnKeyDown(window, w_param); + return 0; + + case WM_MOUSEWHEEL: + Window_OnMouseWheel(window, w_param); + return 0; + + case WM_LBUTTONDOWN: + Window_OnLeftMouseDown(window); + return 0; + + case WM_LBUTTONUP: + Window_OnLeftMouseUp(window); + return 0; + + case WM_MOUSEMOVE: + Window_OnMouseMove(window, l_param); + return 0; + + case WM_DROPFILES: + Window_OnDropFiles(window, w_param); + return 0; + + case WM_PAINT: + Window_OnPaint(window); + return 0; + + default: + return DefWindowProc(window, message, w_param, l_param); + } +} + +int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) +{ + // Initialize COM library (required for WIC image loading) + if (CoInitialize(NULL) != S_OK) { + return 1; + } + + // Initialize WIC library + if (CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC, &IID_IWICImagingFactory, (LPVOID*)&g_wic_factory) != S_OK) { + return 1; + } + + // Register window class + WNDCLASS window_class; + ZeroMemory(&window_class, sizeof(window_class)); + window_class.style = CS_OWNDC; + window_class.lpfnWndProc = Window_Process; + window_class.hInstance = hInstance; + window_class.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(1)); + window_class.hCursor = LoadCursor(NULL, IDC_ARROW); + window_class.lpszClassName = "PATHOLOGIC_MODEL_VIEWER"; + if (!RegisterClass(&window_class)) { + return 1; + } + + // Define window styles + DWORD window_style = WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_SIZEBOX; + + RECT window_rect = { 0, 0, g_screen_width, g_screen_height }; + if (AdjustWindowRect(&window_rect, window_style, FALSE)) { + window_rect.right -= window_rect.left; + window_rect.bottom -= window_rect.top; + window_rect.left = (GetSystemMetrics(SM_CXSCREEN) - window_rect.right) / 2; + window_rect.top = (GetSystemMetrics(SM_CYSCREEN) - window_rect.bottom) / 2; + } + + // Create window + HWND window = CreateWindowEx( + WS_EX_COMPOSITED, window_class.lpszClassName, TEXT("Pathologic Mesh Viewer v0.1"), window_style, + window_rect.left, window_rect.top, window_rect.right, window_rect.bottom, + NULL, NULL, hInstance, NULL); + if (window == INVALID_HANDLE_VALUE) { + return 1; + } + ShowWindow(window, nShowCmd); + + // Start main loop + MSG message; + while (GetMessage(&message, NULL, 0, 0)) { + TranslateMessage(&message); + DispatchMessage(&message); + } + + return 0; +} diff --git a/mesh.c b/mesh.c new file mode 100644 index 0000000..0740a88 --- /dev/null +++ b/mesh.c @@ -0,0 +1,331 @@ +#include "mesh.h" + +#include +#include + +// +// Notes: +// - Seems like .mesh file contains submesh blocks each separated by different material +// - Somewhere in unknown values should be collision data or AABB rect +// + +typedef struct { + int unknown_1; + int unknown_2; + char unknown_3; + unsigned char texture_name_length; + char texture_name[255]; + char unknown_5; // probably null terminator or "texture has alpha channel" flag + int point_count; + int indices_count; +} MeshFileTextureBlock; + +BOOL Mesh_Read(OUT Mesh *mesh, HANDLE file, const char *path, BOOL float_vertices) +{ + DWORD file_size = GetFileSize(file, NULL); + + // Determine texture count + int texture_count; + if (!ReadFile(file, &texture_count, sizeof(int), NULL, NULL)) { + return FALSE; + } + + int mesh_type = 0; + if (texture_count == 0) { + if (!ReadFile(file, &texture_count, sizeof(int), NULL, NULL)) { + return FALSE; + } + mesh_type = 1; + } + + mesh->texture_count = texture_count; + mesh->textures = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(Texture) * texture_count); + + MeshFileTextureBlock *texture_blocks = HeapAlloc(GetProcessHeap(), 0, sizeof(MeshFileTextureBlock) * texture_count); + + for (int i = 0; i < texture_count; ++i) { + MeshFileTextureBlock *block = &texture_blocks[i]; + + // ??? + if (!ReadFile(file, &block->unknown_1, sizeof(int), NULL, NULL)) { + return FALSE; + } + if (!ReadFile(file, &block->unknown_2, sizeof(int), NULL, NULL)) { + return FALSE; + } + if (block->unknown_2 == 1) { + if (!ReadFile(file, &block->unknown_3, sizeof(char), NULL, NULL)) { + return FALSE; + } + } + + // Read texture name + if (!ReadFile(file, &block->texture_name_length, sizeof(char), NULL, NULL)) { + return FALSE; + } + if (!ReadFile(file, block->texture_name, block->texture_name_length, NULL, NULL)) { + return FALSE; + } + block->texture_name[block->texture_name_length] = '\0'; + + // ??? + if (!ReadFile(file, &block->unknown_5, sizeof(char), NULL, NULL)) { // probably null terminator + return FALSE; + } + + if (block->unknown_2 == 5) { + float unknown_4floats[4]; + if (!ReadFile(file, unknown_4floats, sizeof(float) * 4, NULL, NULL)) { + return FALSE; + } + } + + // Read vertices and indices count + if (!ReadFile(file, &block->point_count, sizeof(int), NULL, NULL)) { + return FALSE; + } + if (!ReadFile(file, &block->indices_count, sizeof(int), NULL, NULL)) { + return FALSE; + } + + // Sanity checks + if ((block->point_count * sizeof(int)) > file_size) { + return FALSE; + } + if ((block->indices_count * sizeof(int)) > file_size) { + return FALSE; + } + + // ??? + float unknown_19floats[19]; + if (!ReadFile(file, unknown_19floats, sizeof(float) * 19, NULL, NULL)) { + return FALSE; + } + + if (mesh_type == 1) { + // ??? + int unknown_blocks_count; + if (!ReadFile(file, &unknown_blocks_count, sizeof(int), NULL, NULL)) { + return FALSE; + } + // Sanity check + if ((unknown_blocks_count * ((sizeof(int) * 8) + (sizeof(float) * 16))) > file_size) { + return FALSE; + } + for (int j = 0; j < unknown_blocks_count; ++j) { + int unknown_2; + if (!ReadFile(file, &unknown_2, sizeof(int), NULL, NULL)) { + return FALSE; + } + float unknown_15floats[15]; + if (!ReadFile(file, unknown_15floats, sizeof(float) * 15, NULL, NULL)) { + return FALSE; + } + int unknown_3; + if (!ReadFile(file, &unknown_3, sizeof(int), NULL, NULL)) { + return FALSE; + } + if (unknown_3 == 1) { + int unknown_4; + if (!ReadFile(file, &unknown_4, sizeof(int), NULL, NULL)) { + return FALSE; + } + + int unknown_5; + if (!ReadFile(file, &unknown_5, sizeof(int), NULL, NULL)) { + return FALSE; + } + + int unknown_6; + if (!ReadFile(file, &unknown_6, sizeof(int), NULL, NULL)) { + return FALSE; + } + SetFilePointer(file, sizeof(char) * unknown_6, NULL, FILE_CURRENT); // skip + + int unknown_8; + if (!ReadFile(file, &unknown_8, sizeof(int), NULL, NULL)) { + return FALSE; + } + SetFilePointer(file, sizeof(char) * unknown_8, NULL, FILE_CURRENT); // skip + + int unknown_10; + if (!ReadFile(file, &unknown_10, sizeof(int), NULL, NULL)) { + return FALSE; + } + + int unknown_11; + if (!ReadFile(file, &unknown_11, sizeof(int), NULL, NULL)) { + return FALSE; + } + SetFilePointer(file, sizeof(short) * 4 * unknown_11, NULL, FILE_CURRENT); // skip + + float unknown_13; + if (!ReadFile(file, &unknown_13, sizeof(float), NULL, NULL)) { + return FALSE; + } + } + } + } + } + + // ??? + char unknown_13bytes[13]; + if (!ReadFile(file, unknown_13bytes, sizeof(char) * 13, NULL, NULL)) { + return FALSE; + } + + // Load textures + for (int i = 0; i < texture_count; ++i) { + MeshFileTextureBlock *block = &texture_blocks[i]; + + // Load texture + char texture_path[MAX_PATH]; + strcpy(texture_path, path); // copy .mesh path + if (!PathRemoveFileSpec(texture_path)) { // remove file + return FALSE; + } + if (!PathRemoveFileSpec(texture_path)) { // go up dir + return FALSE; + } + if (PathCombine(texture_path, texture_path, "Textures") == NULL) { // go to "Textures" directory + return FALSE; + } + if (PathCombine(texture_path, texture_path, block->texture_name) == NULL) { // add texture name + return FALSE; + } + if (!Texture_Load(&mesh->textures[i], texture_path)) { + TCHAR message[1000]; + wsprintf(message, "\"%s\" not found. Please extract \"Textures.vfs\" archive", texture_path); + MessageBox(NULL, message, "Texture not found", MB_OK | MB_ICONWARNING); + return FALSE; + } + } + + // Read blocks data +// for (int i = 0; i < texture_count; ++i) { + for (int i = 0; i < 1; ++i) { + MeshFileTextureBlock *block = &texture_blocks[i]; + + // Read points + mesh->point_count = block->point_count; + mesh->points = HeapAlloc(GetProcessHeap(), 0, sizeof(MeshPoint) * mesh->point_count); + for (int j = 0; j < block->point_count; ++j) { + MeshPoint *point = &mesh->points[j]; + + if (float_vertices) { + float x; + if (!ReadFile(file, &x, sizeof(float), NULL, NULL)) { + return FALSE; + } + float y; + if (!ReadFile(file, &y, sizeof(float), NULL, NULL)) { + return FALSE; + } + float z; + if (!ReadFile(file, &z, sizeof(float), NULL, NULL)) { + return FALSE; + } + + // skip unknown 5 floats + float unknown_5floats; + if (!ReadFile(file, &unknown_5floats, sizeof(float) * 5, NULL, NULL)) { + return FALSE; + } + + point->x = x; + point->y = y; + point->z = z; + + } else { + short x; + if (!ReadFile(file, &x, sizeof(short), NULL, NULL)) { + return FALSE; + } + short y; + if (!ReadFile(file, &y, sizeof(short), NULL, NULL)) { + return FALSE; + } + short z; + if (!ReadFile(file, &z, sizeof(short), NULL, NULL)) { + return FALSE; + } + + point->x = (float)x / INT16_MAX; + point->y = (float)y / INT16_MAX; + point->z = (float)z / INT16_MAX; + + // skip unknown 4 bytes + char unknown_4bytes[4]; + if (!ReadFile(file, unknown_4bytes, sizeof(char) * 4, NULL, NULL)) { + return FALSE; + } + + float u; + if (!ReadFile(file, &u, sizeof(float), NULL, NULL)) { + return FALSE; + } + float v; + if (!ReadFile(file, &v, sizeof(float), NULL, NULL)) { + return FALSE; + } + + point->u = u; + point->v = v; + } + } + +// if (skip_unknown_gap) { +// cursor += sizeof(char); // ??? +// } + + // Read triangles + mesh->triangle_count = block->indices_count; + mesh->triangles = HeapAlloc(GetProcessHeap(), 0, sizeof(MeshTriangle) * mesh->triangle_count); + for (int j = 0; j < block->indices_count; ++j) { + MeshTriangle *triangle = &mesh->triangles[j]; + + unsigned short v1; + if (!ReadFile(file, &v1, sizeof(unsigned short), NULL, NULL)) { + return FALSE; + } + unsigned short v2; + if (!ReadFile(file, &v2, sizeof(unsigned short), NULL, NULL)) { + return FALSE; + } + unsigned short v3; + if (!ReadFile(file, &v3, sizeof(unsigned short), NULL, NULL)) { + return FALSE; + } + + // Sanity checks + if (v1 >= mesh->point_count) { return FALSE; } + if (v2 >= mesh->point_count) { return FALSE; } + if (v3 >= mesh->point_count) { return FALSE; } + + triangle->a = v1; + triangle->b = v2; + triangle->c = v3; + } + } + + return TRUE; +} + +BOOL Mesh_LoadFromPathologicFormat(Mesh *mesh, const char *path) +{ + // Open file for reading + HANDLE file = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (file == INVALID_HANDLE_VALUE) { + return FALSE; + } + + // Read mesh + BOOL success = Mesh_Read(mesh, file, path, FALSE); + if (!success) { + ZeroMemory(mesh, sizeof(Mesh)); + } + + CloseHandle(file); + + return success; +} diff --git a/mesh.h b/mesh.h new file mode 100644 index 0000000..04fdd29 --- /dev/null +++ b/mesh.h @@ -0,0 +1,26 @@ +#pragma once + +#include "texture.h" + +typedef struct { + float x; + float y; + float z; + float u; + float v; +} MeshPoint; + +typedef struct { + int a, b, c; +} MeshTriangle; + +typedef struct { + int texture_count; + Texture *textures; + int point_count; + MeshPoint *points; + int triangle_count; + MeshTriangle *triangles; +} Mesh; + +BOOL Mesh_LoadFromPathologicFormat(Mesh *mesh, const char *path); diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..78557d7defbcf30235cd1e58a20167dcce254612 GIT binary patch literal 95309 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
c`9&nHp8plpjGg@90iA2maw)WV^_-Q+Kv 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 Hu0mjfS3RMO literal 0 HcmV?d00001 diff --git a/texture.c b/texture.c new file mode 100644 index 0000000..1c86a78 --- /dev/null +++ b/texture.c @@ -0,0 +1,74 @@ +#include "texture.h" + +#include + +IWICImagingFactory *g_wic_factory; + +BOOL Texture_Load(Texture *texture, const char *path) +{ + // Safety checks + if (texture == NULL || path == NULL || path[0] == '\0') { + return FALSE; + } + + BOOL success = FALSE; + IWICFormatConverter *converter = NULL; + IWICBitmapDecoder *decoder = NULL; + IWICBitmapFrameDecode *frame = NULL; + + // Check WIC library is initialized + if (g_wic_factory == NULL) { + fprintf(stderr, "Failed to load image \"%s\": WIC library is not initialized\n", path); + return FALSE; + } + + // Create the WIC format converter + if (g_wic_factory->lpVtbl->CreateFormatConverter(g_wic_factory, &converter) != S_OK) { + fprintf(stderr, "Failed to load image \"%s\": Unable to create the WIC file format converter\n", path); + goto _EXIT; + } + + // Convert path from PCSTR to PCWSTR + WCHAR path_wide[MAX_PATH]; + int path_wide_length = MultiByteToWideChar(CP_ACP, 0, path, -1, NULL, 0); + MultiByteToWideChar(CP_ACP, 0, path, -1, path_wide, path_wide_length); + + // Create decoder from the file name + if (g_wic_factory->lpVtbl->CreateDecoderFromFilename(g_wic_factory, path_wide, NULL, GENERIC_READ, WICDecodeMetadataCacheOnLoad, &decoder) != S_OK) { + fprintf(stderr, "Failed to load image \"%s\": Path not found\n", path); + goto _EXIT; + } + + // Decode the first image frame (usually there are always just one frame, except for the .gif animations or something like this) + if (decoder->lpVtbl->GetFrame(decoder, 0, &frame) != S_OK) { + goto _EXIT; + } + + // Get image data + if (converter->lpVtbl->Initialize(converter, (IWICBitmapSource *)frame, &GUID_WICPixelFormat32bppBGR, WICBitmapDitherTypeNone, NULL, 0.0, WICBitmapPaletteTypeCustom) != S_OK) { + goto _EXIT; + } + if (converter->lpVtbl->GetSize(converter, &texture->width, &texture->height) != S_OK) { + goto _EXIT; + } + UINT step = texture->width * sizeof(DWORD); + UINT buffer_size = texture->height * step; + texture->data = HeapAlloc(GetProcessHeap(), 0, buffer_size); + if (texture->data == NULL) { + fprintf(stderr, "Failed to load image \"%s\": Not enough memory to allocate the surface\n", path); + goto _EXIT; + } + if (converter->lpVtbl->CopyPixels(converter, NULL, step, buffer_size, (BYTE *)texture->data) != S_OK) { + goto _EXIT; + } + + success = TRUE; // if code executing reaches this line - everything is ok + +_EXIT: + // Release WIC objects + if (converter != NULL) { converter->lpVtbl->Release(converter); } + if (decoder != NULL) { decoder->lpVtbl->Release(decoder); } + if (frame != NULL) { frame->lpVtbl->Release(frame); } + + return success; +} diff --git a/texture.h b/texture.h new file mode 100644 index 0000000..19aa020 --- /dev/null +++ b/texture.h @@ -0,0 +1,15 @@ +#pragma once + +#include +#include + +typedef struct { + UINT width; + UINT height; + DWORD *data; +} Texture; + +// WIC factory instance for loading game textures +extern IWICImagingFactory *g_wic_factory; + +BOOL Texture_Load(Texture *texture, const char *path);