Skip to content

Commit 83530e1

Browse files
committed
PNG/Transparency for Textures, Fixed Back/Front primitives
1 parent ff3e690 commit 83530e1

6 files changed

Lines changed: 51 additions & 17 deletions

File tree

CMakeLists.txt

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,36 @@ PROJECT(DW1ModelConverter)
44
SET(CMAKE_CXX_STANDARD 20)
55

66
# --- Libraries ---
7+
# boost
8+
#FIND_PACKAGE(Boost 1.75 REQUIRED)
9+
#INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} )
10+
11+
# libpng
12+
FIND_PACKAGE(PNG REQUIRED)
13+
INCLUDE_DIRECTORIES(${PNG_INCLUDE_DIR})
14+
715
# tinyxml2
816
ADD_SUBDIRECTORY("libs/tinyxml2")
917

18+
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Dcimg_use_png")
1019
INCLUDE_DIRECTORIES( "libs" )
1120

12-
# boost
13-
#FIND_PACKAGE(Boost 1.75 REQUIRED)
14-
#INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} )
15-
1621
# --- Tools ---
1722

1823
SET(SOURCE_FILES ${SOURCE_FILES} "src/main.cpp" "src/TIM.cpp" "src/Collada.cpp" "src/Animation.cpp" "src/CLUTMap.cpp"
1924
"src/Model.cpp")
2025

2126
ADD_EXECUTABLE(DW1ModelConverter ${SOURCE_FILES})
22-
TARGET_LINK_LIBRARIES(DW1ModelConverter tinyxml2)
27+
TARGET_LINK_LIBRARIES(DW1ModelConverter PUBLIC tinyxml2 PNG::PNG)
28+
29+
# Copy .dll dependencies. Extremely dirty!
30+
if(WIN32)
31+
FIND_FILE(PNG_FILE "bin/libpng16d.dll")
32+
FIND_FILE(ZLIB_FILE "bin/zlib.dll" PATHS "${ZLIB_INCLUDE_DIR}/..")
33+
34+
ADD_CUSTOM_COMMAND(TARGET DW1ModelConverter POST_BUILD
35+
COMMAND ${CMAKE_COMMAND} -E copy ${PNG_FILE} $<TARGET_FILE_DIR:DW1ModelConverter>
36+
COMMAND ${CMAKE_COMMAND} -E copy ${ZLIB_FILE} $<TARGET_FILE_DIR:DW1ModelConverter>
37+
COMMAND_EXPAND_LISTS
38+
)
39+
endif()

src/Model.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,13 @@ std::vector<Face> Primitive::toFaces()
7777
{
7878
std::vector<Face> faces;
7979

80-
faces.push_back(getFace(0, 1, 2));
81-
if (flag.isDoubleFaced) faces.push_back(getFace(2, 1, 0));
80+
faces.push_back(getFace(2, 1, 0));
81+
if (flag.isDoubleFaced) faces.push_back(getFace(0, 1, 2));
8282

8383
if (mode.isQuad)
8484
{
85-
faces.push_back(getFace(3, 2, 1));
86-
if (flag.isDoubleFaced) faces.push_back(getFace(1, 2, 3));
85+
faces.push_back(getFace(1, 2, 3));
86+
if (flag.isDoubleFaced) faces.push_back(getFace(3, 2, 1));
8787
}
8888

8989
return faces;

src/Model.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ struct SVector
8181

8282
FVector convertToFixedPoint(uint32_t decimalBits)
8383
{
84-
float scale = -1.0f / (1 << decimalBits);
84+
float scale = 1.0f / (1 << decimalBits);
8585
return { x * scale, y * scale, z * scale };
8686
}
8787

src/TIM.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ static uint32_t toTexturePage(uint32_t x, uint32_t y) { return (x / 64) + ((y /
99

1010
void AbstractTIM::writeImage(CLUTMap& clutMap, std::filesystem::path path)
1111
{
12-
cimg::CImg<uint8_t> new_image(width, height, 1, 3, 0);
12+
cimg::CImg<uint8_t> new_image(width, height, 1, 4, 0);
1313
auto& clut = clutMap[toTexturePage(pixelOrgX, pixelOrgY)];
1414

1515
for (uint32_t y = 0; y < height; y++)
@@ -23,13 +23,11 @@ void AbstractTIM::writeImage(CLUTMap& clutMap, std::filesystem::path path)
2323
uint32_t palette = clutCoord.coords.y - clutOrgY;
2424

2525
TIMColor color = palettes[palette][pixels[(y * static_cast<uint64_t>(width)) + x]];
26-
const uint8_t bla[] = { static_cast<uint8_t>(color.r * 8),
27-
static_cast<uint8_t>(color.g * 8),
28-
static_cast<uint8_t>(color.b * 8) };
29-
new_image.draw_point(x, y, bla, 1.0f);
26+
RGBA rgba = color.getColor();
27+
new_image.draw_point(x, y, reinterpret_cast<uint8_t*>(&rgba), 1.0f);
3028
}
3129

32-
new_image.save_bmp(path.string().c_str());
30+
new_image.save_png(path.string().c_str());
3331
}
3432

3533
AbstractTIM::AbstractTIM(const std::filesystem::path path)

src/TIM.hpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,31 @@
99
#include <utility>
1010
#include <vector>
1111

12+
struct RGBA
13+
{
14+
uint8_t r;
15+
uint8_t g;
16+
uint8_t b;
17+
uint8_t a;
18+
};
19+
1220
struct TIMColor
1321
{
1422
uint16_t r : 5;
1523
uint16_t g : 5;
1624
uint16_t b : 5;
1725
uint16_t stp : 1;
26+
27+
const RGBA getColor()
28+
{
29+
if (r == 0 && g == 0 && b == 0 && stp == 0) return { 0, 0, 0, 0 }; // transparent
30+
if (r == 0 && g == 0 && b == 0 && stp == 1) return { 0, 0, 0, 255 }; // black
31+
32+
return { static_cast<uint8_t>(r << 3),
33+
static_cast<uint8_t>(g << 3),
34+
static_cast<uint8_t>(b << 3),
35+
static_cast<uint8_t>(0xFF - stp * 0x80) };
36+
}
1837
};
1938

2039
struct CLUT4BPP

src/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ int main()
1717
exporter.getDocument().SaveFile("BOYS.dae");
1818
CLUTMap clutMap(model);
1919

20-
tim.writeImage(clutMap, "BOYS.bmp");
20+
tim.writeImage(clutMap, "BOYS.png");
2121

2222
// TODO support transparency channel for textures
2323
// TODO support for texture+color primitives

0 commit comments

Comments
 (0)