Final Conan v2 support fix #29

Merged
JackCarterSmith merged 3 commits from develop into master 2024-09-22 15:44:19 +02:00
7 changed files with 206 additions and 80 deletions

View File

@ -20,7 +20,7 @@ if(DEFINED ENV{CI}) # Jenkins CI integration mode
project(rse-model VERSION $ENV{CI_VERSION}.$ENV{CI_BUILD_NUMBER} DESCRIPTION "RogueSquadron Extractor - Model" LANGUAGES C)
set(RSE_MODEL_NAME $ENV{CI_OUTPUT_NAME})
else() # Standalone project mode, should not be used for release.
project(rse-model VERSION 2.3.0 DESCRIPTION "RogueSquadron Extractor - Model" LANGUAGES C)
project(rse-model VERSION 2.4.0 DESCRIPTION "RogueSquadron Extractor - Model" LANGUAGES C)
set(RSE_MODEL_NAME RSEModel)
endif()
set(RSP_MODEL_LIB_NAME RSPModel${PROJECT_VERSION_MAJOR}${PROJECT_VERSION_MINOR})

13
Jenkinsfile vendored
View File

@ -12,7 +12,6 @@ pipeline {
stage('Prepare') {
steps {
cleanWs()
rtConanClient(id: "conan", userHome: "/home/jackcartersmith")
}
}
stage('Build') {
@ -22,20 +21,16 @@ pipeline {
dir("linux") {
checkout([$class: 'GitSCM', branches: [[name: '**']], browser: [$class: 'GiteaBrowser', repoUrl: 'https://git.jcsmith.fr/JCS-Prod/RSE-Model'], extensions: [], userRemoteConfigs: [[credentialsId: 'jenkins-ssh', url: 'ssh://git@git.jcsmith.fr:2322/JCS-Prod/RSE-Model.git']]])
sh 'git submodule update --init --recursive'
dir("build") {
rtConanRun(clientId: "conan", command: "install .. -s build_type=Release -pr:b=default -pr:h=default --build=missing")
}
cmakeBuild buildDir: 'build', cmakeArgs: '-DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake" -DCMAKE_BUILD_TYPE=Release', installation: 'latest', steps: [[args: 'all']]
sh 'conan install . -of build -s build_type=Release -o "&:tools=True" -pr:b=default -pr:h=default --build=missing'
cmakeBuild buildDir: 'build', cmakeArgs: '-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -RSPMODEL_SHARED=ON -RSPMODEL_STATIC=OFF -DBUILD_TOOLS=ON -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DCMAKE_BUILD_TYPE=Release', installation: 'latest', steps: [[args: 'all']]
}
},
windows: {
dir("windows") {
checkout([$class: 'GitSCM', branches: [[name: '**']], browser: [$class: 'GiteaBrowser', repoUrl: 'https://git.jcsmith.fr/JCS-Prod/RSE-Model'], extensions: [], userRemoteConfigs: [[credentialsId: 'jenkins-ssh', url: 'ssh://git@git.jcsmith.fr:2322/JCS-Prod/RSE-Model.git']]])
sh 'git submodule update --init --recursive'
dir("build") {
rtConanRun(clientId: "conan", command: "install .. -s build_type=Release -pr:b=default -pr:h=windows --build=missing")
}
cmakeBuild buildDir: 'build', cmakeArgs: '-DCMAKE_SYSTEM_NAME=Windows -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=x86_64-w64-mingw32-windres -DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake" -DCMAKE_BUILD_TYPE=Release', installation: 'latest', steps: [[args: 'all']]
sh 'conan install . -of build -s build_type=Release -o "&:tools=True" -pr:b=default -pr:h=windows --build=missing'
cmakeBuild buildDir: 'build', cmakeArgs: '-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake -RSPMODEL_SHARED=ON -RSPMODEL_STATIC=OFF -DBUILD_TOOLS=ON -DCMAKE_POLICY_DEFAULT_CMP0091=NEW -DCMAKE_BUILD_TYPE=Release -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_RC_COMPILER=x86_64-w64-mingw32-windres', installation: 'latest', steps: [[args: 'all']]
}
}
)

View File

@ -90,7 +90,10 @@ typedef struct rspmodel_obj_parts {
unsigned int vertex_block_offset;
unsigned int id;
T_RSPMODEL_VECTOR3 transform;
T_RSPMODEL_VECTOR3 offset_transform;
T_RSPMODEL_VECTOR3 scale_transform;
T_RSPMODEL_VECTOR3 rotate_transform;
T_RSPMODEL_VECTOR3 translate_transform;
unsigned int face_count;
T_RSPMODEL_FACE* faces;

View File

@ -350,17 +350,45 @@ static unsigned short ParseObjectMeshDef(T_RSPMODEL_OBJ_PARTS* pObjPartStruct, c
// Get meshdef0 datas
//pObjPartStruct->id = hobObjMeshDef0->object_id; // Get object part ID, used by animation? bones?
pObjPartStruct->transform.x = hobObjMeshDef0->transform_x; // Get the transform matrix, used by complex objects like at-st and at-at (at this time)
pObjPartStruct->transform.y = hobObjMeshDef0->transform_y;
pObjPartStruct->transform.z = hobObjMeshDef0->transform_z;
pObjPartStruct->offset_transform.x = hobObjMeshDef0->offsett_x; // used by complex/animated objects like at-st, at-at, xwing, etc.
pObjPartStruct->offset_transform.y = hobObjMeshDef0->offsett_y;
pObjPartStruct->offset_transform.z = hobObjMeshDef0->offsett_z;
pObjPartStruct->scale_transform.x = hobObjMeshDef0->scalet_x; // used by complex/animated objects like at-st, at-at, xwing, etc.
pObjPartStruct->scale_transform.y = hobObjMeshDef0->scalet_y;
pObjPartStruct->scale_transform.z = hobObjMeshDef0->scalet_z;
pObjPartStruct->rotate_transform.x = hobObjMeshDef0->rott_x; // used by complex/animated objects like at-st, at-at, xwing, etc.
pObjPartStruct->rotate_transform.y = hobObjMeshDef0->rott_y;
pObjPartStruct->rotate_transform.z = hobObjMeshDef0->rott_z;
pObjPartStruct->translate_transform.x = hobObjMeshDef0->transt_x; // used by complex/animated objects like at-st, at-at, xwing, etc.
pObjPartStruct->translate_transform.y = hobObjMeshDef0->transt_y;
pObjPartStruct->translate_transform.z = hobObjMeshDef0->transt_z;
if (pParams->verbose_mode) {
printf("[DBG] > Facegroup/object transform matrix: [%.8f %.8f %.8f]\n",
pObjPartStruct->transform.x,
pObjPartStruct->transform.y,
pObjPartStruct->transform.z
printf("[DBG] > Parent meshdef0 offset: 0x%X\n", hobObjMeshDef0->parent_meshdef0_offset);
printf("[DBG] > Children meshdef0 offset: 0x%X\n", hobObjMeshDef0->children_meshdef0_offset);
printf("[DBG] > Have offset transform: %d\n", (hobObjMeshDef0->vecsFlags & 0x1)?1:0);
printf("[DBG] > Have scaling? vector: %d\n", (hobObjMeshDef0->vecsFlags & 0x2)?1:0);
printf("[DBG] > Have translation? vector: %d\n", (hobObjMeshDef0->vecsFlags & 0x4)?1:0);
printf("[DBG] > Have offset? vector: %d\n", (hobObjMeshDef0->vecsFlags & 0x8)?1:0);
printf("[DBG] > ObjPart offset transform: [%.8f %.8f %.8f]\n",
pObjPartStruct->offset_transform.x,
pObjPartStruct->offset_transform.y,
pObjPartStruct->offset_transform.z
);
printf("[DBG] > ObjPart scale transform: [%.8f %.8f %.8f]\n",
pObjPartStruct->scale_transform.x,
pObjPartStruct->scale_transform.y,
pObjPartStruct->scale_transform.z
);
printf("[DBG] > ObjPart rotate transform: [%.8f %.8f %.8f]\n",
pObjPartStruct->rotate_transform.x,
pObjPartStruct->rotate_transform.y,
pObjPartStruct->rotate_transform.z
);
printf("[DBG] > ObjPart translate transform: [%.8f %.8f %.8f]\n",
pObjPartStruct->translate_transform.x,
pObjPartStruct->translate_transform.y,
pObjPartStruct->translate_transform.z
);
printf("[DBG] > Prev meshdef0 offset: 0x%X\n", hobObjMeshDef0->prev_meshdef0_offset);
printf("[DBG] > Next meshdef0 offset: 0x%X\n", hobObjMeshDef0->next_meshdef0_offset);
}
if (pParams->god_mode) {
printf("[DBG] > meshdef0 offset1: 0x%X\n", hobObjMeshDef0->offset1);
@ -370,20 +398,6 @@ static unsigned short ParseObjectMeshDef(T_RSPMODEL_OBJ_PARTS* pObjPartStruct, c
printf("[DBG] > meshdef0 unknown4: %.8f\n", hobObjMeshDef0->unknown4);
printf("[DBG] > meshdef0 unknown5: %.8f\n", hobObjMeshDef0->unknown5);
printf("[DBG] > meshdef0 unknown6: 0x%X\n", hobObjMeshDef0->unknown6);
printf("[DBG] > meshdef0 unknown7: %.8f\n", hobObjMeshDef0->unknown7);
printf("[DBG] > meshdef0 unknown8: %.8f\n", hobObjMeshDef0->unknown8);
printf("[DBG] > meshdef0 unknown9: %.8f\n", hobObjMeshDef0->unknown9);
printf("[DBG] > meshdef0 unknown10: %.8f\n", hobObjMeshDef0->unknown10);
printf("[DBG] > meshdef0 unknown11: %.8f\n", hobObjMeshDef0->unknown11);
printf("[DBG] > meshdef0 unknown12: %.8f\n", hobObjMeshDef0->unknown12);
printf("[DBG] > meshdef0 unknown13: %.8f\n", hobObjMeshDef0->unknown13);
printf("[DBG] > meshdef0 unknown14: %.8f\n", hobObjMeshDef0->unknown14);
printf("[DBG] > meshdef0 unknown15: %.8f\n", hobObjMeshDef0->unknown15);
printf("[DBG] > meshdef0 unknown16: %.8f\n", hobObjMeshDef0->unknown16);
}

View File

@ -1,6 +1,6 @@
/**
* @file hob_struct.h
* @date 21/02/2023
* @date 18/09/2023
* @author JackCarterSmith
* @copyright GPL-v3.0
* @brief HOB file mapping definition.
@ -69,18 +69,18 @@ typedef struct PACK hobfile_obj_header {
unsigned int effects_offset; // Empty in gun_turret and no datas after, xwing have 0x5006, present in koelsch. worddevastator can have more answers...
unsigned int properties_offset; // Offset to different string (a_b/zf/zt/zb/etc.) Animation datas ? Empty with 6x float in train_hob, a_b object is canon beams in gun_turret
float unknown4; // Probably scale: 1.0F/1.125F
float unknown4; // 1.0F/1.125F - Look forward angle correction?
unsigned int reserved4; // 12B of zeros
unsigned int reserved5;
unsigned int reserved6;
float unknown5; //Scale? ~20.0F
float unknown6; //Scale? ~77-418.0F
float unknown5; // Something related to culling camera frustum (when reduced value, the gun_turret didn't render before getting out of camera view)
float unknown6; // Something related to collision detection (bigger float >100.0f)
float reserved7; //Translation matrix? Center of object?
float reserved8;
float reserved9;
float reserved7; // Something related to collision detection Translation matrix? Center of object?
float reserved8; // Something related to collision detection Translation matrix? Center of object?
float reserved9; // Something related to collision detection Translation matrix? Center of object?
unsigned int footer_offset; //To redefine, seem to be a copy of following bounding box? Maybe there are 2 box: render and collision?
@ -142,52 +142,52 @@ typedef struct PACK hobfile_effects {
*/
typedef struct PACK hobfile_meshdef0 {
unsigned int offset1;
unsigned int offset2;
unsigned int prev_meshdef0_offset;
unsigned int next_meshdef0_offset;
unsigned int offset1; // Brothers meshdef?
unsigned int offset2; // Brothers meshdef?
unsigned int parent_meshdef0_offset;
unsigned int children_meshdef0_offset;
unsigned int meshdef1_offset_plus_4;
unsigned int reserved1; // 8B of zeros
unsigned int reserved2;
float unknown3;
float unknown3; // Always 1.0f?
unsigned int reserved3; // 12B of zeros
unsigned int reserved4;
unsigned int reserved5;
float unknown4;
float unknown4; // Always 1.0f?
unsigned int reserved6; // 12B of zeros
unsigned int reserved7;
unsigned int reserved8;
float unknown5;
float unknown5; // Always 1.0f?
unsigned int reserved9; // 12B of zeros
unsigned int reserved10;
unsigned int reserved11;
unsigned int unknown6; // Not fg_object_ID
unsigned int vecsFlags; // Enabled local transforms (bit0=offset #1; bit1=scale #2; bit2=rotation #3; bit3=translation;)
float unknown7; // Can be a vector???
float unknown8;
float unknown9;
float offsett_x; // Offset transform (aka. reverse translation)
float offsett_y;
float offsett_z;
float unknown10; // Can be a vector???
float unknown11;
float unknown12;
float scalet_x; // Local transform - Scale
float scalet_y;
float scalet_z;
float unknown13; // Can be a matrix???
float unknown14;
float unknown15;
float rott_x; // Local transform - Rotation
float rott_y;
float rott_z;
float unknown16;
float unknown16; // Always 0?
float transform_x;
float transform_y;
float transform_z;
float transt_x; // Local transform - Translation
float transt_y;
float transt_z;
} T_HOBFILE_MESHDEF0;
typedef struct PACK hobfile_meshdef1 {

132
conanfile.py Normal file
View File

@ -0,0 +1,132 @@
import os
from conan import ConanFile
from conan.tools.cmake import CMakeToolchain, CMakeDeps, CMake
from conan.tools.files import copy
from conan.tools.scm import Git, Version
required_conan_version = ">=2.3"
class rse_model(ConanFile):
name = "rspmodellib"
package_type = "library"
version = "2.3.1"
revision_mode = "scm"
license = "GPL-3.0"
author = "JackCarterSmith <jackcartersmith@jcsmith.fr>"
url = "https://git.jcsmith.fr/JCS-Prod/RSE-Model"
description = "Rogue Squadron 3D (PC) game models files (HOB) extractor"
settings = "os", "compiler", "build_type", "arch"
generators = "CMakeDeps"
options = {
"shared": [True, False],
"tools": [True, False],
"fPIC": [True, False]
}
default_options = {
"shared": True,
"tools": False,
"fPIC": True
}
@property
def _is_msvc(self):
return str(self.settings.compiler) in ["Visual Studio", "msvc"]
#def validate(self):
# if self.settings.os == "Macos":
# raise ConanInvalidConfiguration("MacOS not supported")
def config_options(self):
if self.settings.os == "Windows":
del self.options.fPIC
def configure(self):
self.options["glew"].shared = True
#self.options["vulkan-loader"].shared = True
if self.options.shared:
self.options.rm_safe("fPIC")
def requirements(self):
if self.options.tools:
#self.requires("opengl/system")
#self.requires("glu/system")
self.requires("glew/2.2.0")
#self.requires("vulkan-headers/1.3.236.0")
#self.requires("vulkan-memory-allocator/3.0.1")
#self.requires("vulkan-loader/1.3.236.0")
def source(self):
git = Git(self)
cargs = ['--single-branch', '--recursive', '--depth', '1', '--branch', 'v' + self.version]
git.clone(url="https://git.jcsmith.fr/JCS-Prod/RSE-Model.git", target=".", args=cargs)
# def _patch(self):
# replace_in_file(self, os.path.join(self.source_folder, "RSPModelLib", "CMakeLists.txt"),
# 'set_target_properties(rsp-texture-libstatic PROPERTIES OUTPUT_NAME "${RSP_TEXTURE_LIB_NAME}_static")',
# 'set_target_properties(rsp-texture-libstatic PROPERTIES OUTPUT_NAME "${RSP_TEXTURE_LIB_NAME}")')
def export_sources(self):
copy(self, "CMakeLists.txt", self.recipe_folder, self.export_sources_folder)
# def layout(self):
# cmake_layout(self, src_folder='.', build_folder='build')
def generate(self):
tc = CMakeToolchain(self)
tc.cache_variables["RSPMODEL_SHARED"] = self.options.shared
tc.cache_variables["RSPMODEL_STATIC"] = not self.options.shared
tc.cache_variables["BUILD_TOOLS"] = self.options.tools
#tc.cache_variables["BUILD_DEBUG"] = self.settings.build_type == "Debug"
tc.generate()
#cmdeps = CMakeDeps(self)
#cmpdeps.set_property("glew", "cmake_find_mode", "both")
#if self.options.shared:
#cmdeps.configuration = "ReleaseShared"
#cmdeps.generate()
for dep in self.dependencies.values():
if len(dep.cpp_info.bindirs) > 0:
if self.settings.os == "Windows":
if self._is_msvc:
copy(self, "*.dll", dep.cpp_info.bindirs[0], os.path.join(self.build_folder, "bin", str(self.settings.build_type)))
else:
copy(self, "*.dll", dep.cpp_info.bindirs[0], os.path.join(self.build_folder, "bin"))
else:
copy(self, "*.so", dep.cpp_info.bindirs[0], os.path.join(self.build_folder, "bin"))
def build(self):
cmbuilder = CMake(self)
#self._patch()
cmbuilder.configure()
cmbuilder.build()
def package(self):
copy(self, "LICENSE", src=self.source_folder, dst=os.path.join(self.package_folder, "licenses"))
copy(self, pattern="*.h", src=os.path.join(self.source_folder, "include"), dst=os.path.join(self.package_folder, "include"))
copy(self, pattern="*.a", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False)
copy(self, pattern="*.so", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False)
copy(self, pattern="*.lib", src=self.build_folder, dst=os.path.join(self.package_folder, "lib"), keep_path=False)
copy(self, pattern="*.dll", src=self.build_folder, dst=os.path.join(self.package_folder, "bin"), keep_path=False)
def package_info(self):
self.cpp_info.set_property("cmake_file_name", "RSEModel")
self.cpp_info.set_property("cmake_target_name", "RSEModel")
self.cpp_info.set_property("cmake_module_target_name", "RSEModel::RSEModel")
self.cpp_info.set_property("cmake_find_mode", "both")
self.cpp_info.names["cmake_find_package"] = "RSEModel"
self.cpp_info.names["cmake_find_package_multi"] = "RSEModel"
self.cpp_info.includedirs = ["include"]
prefix = "lib" if self._is_msvc else ""
#suffix = "d" if self.settings.build_type == "Debug" else ""
suffix = ""
major_min_version = f"{Version(self.version).major}{Version(self.version).minor}"
self.cpp_info.libs = ["{}RSEModel{}{}".format(prefix, major_min_version, suffix)]
if self.settings.os in ["Linux", "Android", "FreeBSD", "SunOS", "AIX"]:
self.cpp_info.system_libs.append("m")
self.cpp_info.system_libs.append("dl")

View File

@ -1,18 +0,0 @@
[requires]
#opengl/system
#glu/system
glew/2.2.0
#vulkan-headers/1.3.236.0
#vulkan-memory-allocator/3.0.1
#vulkan-loader/1.3.236.0
[generators]
CMakeDeps
CMakeToolchain
[options]
glew/*:shared=True
#vulkan-loader/*:shared=True
[imports]
bin, *.dll -> ./bin