Support project conversion #27
|
@ -1195,6 +1195,14 @@ dependencies = [
|
||||||
"syn 2.0.96",
|
"syn 2.0.96",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cpp_out"
|
||||||
|
version = "1.0.2"
|
||||||
|
dependencies = [
|
||||||
|
"clap",
|
||||||
|
"tool_helper",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cpufeatures"
|
name = "cpufeatures"
|
||||||
version = "0.2.17"
|
version = "0.2.17"
|
||||||
|
@ -4065,6 +4073,7 @@ dependencies = [
|
||||||
"bitflags 2.8.0",
|
"bitflags 2.8.0",
|
||||||
"cdtypes",
|
"cdtypes",
|
||||||
"clap",
|
"clap",
|
||||||
|
"cpp_out",
|
||||||
"hound",
|
"hound",
|
||||||
"image 0.24.9",
|
"image 0.24.9",
|
||||||
"paste",
|
"paste",
|
||||||
|
|
|
@ -28,6 +28,7 @@ symphonia-vorbis = ["symphonia", "symphonia/vorbis"]
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bitflags = "2.8.0"
|
bitflags = "2.8.0"
|
||||||
cdtypes = {path = "../cdtypes"}
|
cdtypes = {path = "../cdtypes"}
|
||||||
|
cpp_out = {path = "../cpp_out"}
|
||||||
clap = {version = "4.5.27", features = ["derive"]}
|
clap = {version = "4.5.27", features = ["derive"]}
|
||||||
image = "0.24.9"
|
image = "0.24.9"
|
||||||
hound = "3.5.1"
|
hound = "3.5.1"
|
||||||
|
|
|
@ -17,7 +17,7 @@ pub enum SubCommands {
|
||||||
TIM(tim::Arguments),
|
TIM(tim::Arguments),
|
||||||
VAG(vag::Arguments),
|
VAG(vag::Arguments),
|
||||||
XA(xa::Arguments),
|
XA(xa::Arguments),
|
||||||
Project,
|
Project(project::Arguments),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_subcommand(compress_lz4: bool, input_path: Option<PathBuf>, output_path: Option<PathBuf>, sub_command: SubCommands) -> Result<(), Error> {
|
pub fn run_subcommand(compress_lz4: bool, input_path: Option<PathBuf>, output_path: Option<PathBuf>, sub_command: SubCommands) -> Result<(), Error> {
|
||||||
|
@ -41,7 +41,7 @@ pub fn run_subcommand(compress_lz4: bool, input_path: Option<PathBuf>, output_pa
|
||||||
SubCommands::TIM(args) => tim::convert(args, input, dst_buffer),
|
SubCommands::TIM(args) => tim::convert(args, input, dst_buffer),
|
||||||
SubCommands::VAG(args) => audio::vag::convert(args, &output_path, input, dst_buffer),
|
SubCommands::VAG(args) => audio::vag::convert(args, &output_path, input, dst_buffer),
|
||||||
SubCommands::XA(args) => audio::xa::convert(args, input, dst_buffer),
|
SubCommands::XA(args) => audio::xa::convert(args, input, dst_buffer),
|
||||||
SubCommands::Project => project::run_project(input, input_path, &output_path),
|
SubCommands::Project(args) => project::run_project(input, args, input_path, &output_path),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use tim_tool::logic::project::Job;
|
||||||
|
use tool_helper::{Error, Output};
|
||||||
|
|
||||||
|
pub struct CppHeader {
|
||||||
|
file_out: Output,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CppHeader {
|
||||||
|
pub fn new(file_path: &Option<PathBuf>) -> Result<CppHeader, Error> {
|
||||||
|
let mut file_out = tool_helper::open_output(file_path)?;
|
||||||
|
|
||||||
|
writeln!(file_out, "#pragma once")?;
|
||||||
|
writeln!(file_out, "#include <PSX/File/cd_file_types.hpp>")?;
|
||||||
|
writeln!(file_out, "")?;
|
||||||
|
|
||||||
|
Ok(CppHeader{file_out})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn push_job(&mut self, job: &Job) -> Result<(), Error> {
|
||||||
|
let name = job.name.replace('.', "_");
|
||||||
|
let (clut_x, clut_y) = if let Some(palette_rect) = &job.palette_rect {(palette_rect.pos.x, palette_rect.pos.y)} else {(0, 0)};
|
||||||
|
|
||||||
|
writeln!(self.file_out, "namespace {} {{", name)?;
|
||||||
|
writeln!(self.file_out, "\tusing namespace JabyEngine;")?;
|
||||||
|
writeln!(self.file_out, "")?;
|
||||||
|
writeln!(self.file_out, "\tstatic constexpr auto tim = SimpleTIM::create({}, {}, {}, {});", job.image_pos.x, job.image_pos.y, clut_x, clut_y)?;
|
||||||
|
writeln!(self.file_out, "\tstatic constexpr auto size = GPU::SizeI16::create({}, {});", 0, 0)?;
|
||||||
|
writeln!(self.file_out, "}}")?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Drop for CppHeader {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,19 @@
|
||||||
use crate::images::args::{Arguments, ClutAlignment, ColorType};
|
mod hpp_out;
|
||||||
|
|
||||||
|
use crate::images::args::{Arguments as IMGArguments, ClutAlignment, ColorType};
|
||||||
|
use clap::Args;
|
||||||
|
use hpp_out::CppHeader;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use tool_helper::{Error, Input};
|
use tool_helper::{Error, Input};
|
||||||
use tim_tool::logic::{tim::types::Encoding, project::*};
|
use tim_tool::logic::{tim::types::Encoding, project::*};
|
||||||
|
|
||||||
pub fn run_project(input: Input, input_path: Option<PathBuf>, output_path: &Option<PathBuf>) -> Result<(), Error> {
|
#[derive(Args)]
|
||||||
|
pub struct Arguments {
|
||||||
|
#[clap(long="hpp", value_parser)]
|
||||||
|
hpp_out_path: Option<PathBuf>
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run_project(input: Input, args: Arguments, input_path: Option<PathBuf>, output_path: &Option<PathBuf>) -> Result<(), Error> {
|
||||||
let location_path = if let Some(input_path) = input_path {input_path} else {PathBuf::from(".")};
|
let location_path = if let Some(input_path) = input_path {input_path} else {PathBuf::from(".")};
|
||||||
let output_path = if let Some(output_path) = &output_path {
|
let output_path = if let Some(output_path) = &output_path {
|
||||||
let mut output_path = output_path.clone();
|
let mut output_path = output_path.clone();
|
||||||
|
@ -13,8 +23,11 @@ pub fn run_project(input: Input, input_path: Option<PathBuf>, output_path: &Opti
|
||||||
output_path
|
output_path
|
||||||
} else {PathBuf::from(".")};
|
} else {PathBuf::from(".")};
|
||||||
let project = serde_json::from_reader::<Input, Project>(input).map_err(|error|{Error::from_text(format!("Reading project failed: {}", error))})?;
|
let project = serde_json::from_reader::<Input, Project>(input).map_err(|error|{Error::from_text(format!("Reading project failed: {}", error))})?;
|
||||||
|
let mut hpp_out = CppHeader::new(&args.hpp_out_path)?;
|
||||||
|
|
||||||
for job in project.jobs {
|
for job in project.jobs {
|
||||||
|
hpp_out.push_job(&job)?;
|
||||||
|
|
||||||
let args = to_arguments(&job)?;
|
let args = to_arguments(&job)?;
|
||||||
let output_path = {
|
let output_path = {
|
||||||
let mut path = output_path.clone();
|
let mut path = output_path.clone();
|
||||||
|
@ -26,16 +39,15 @@ pub fn run_project(input: Input, input_path: Option<PathBuf>, output_path: &Opti
|
||||||
|
|
||||||
let sub_command = crate::SubCommands::SimpleTIM(args);
|
let sub_command = crate::SubCommands::SimpleTIM(args);
|
||||||
crate::run_subcommand(job.settings.compress, Some(Job::create_file_path(job.file_path, &location_path)), Some(output_path), sub_command)?;
|
crate::run_subcommand(job.settings.compress, Some(Job::create_file_path(job.file_path, &location_path)), Some(output_path), sub_command)?;
|
||||||
// Create .cpp file
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_arguments(job: &Job) -> Result<Arguments, Error> {
|
fn to_arguments(job: &Job) -> Result<IMGArguments, Error> {
|
||||||
let (semi_transparent, transparent_palette) = get_transparency(&job.settings.transparency);
|
let (semi_transparent, transparent_palette) = get_transparency(&job.settings.transparency);
|
||||||
|
|
||||||
return Ok(Arguments {
|
return Ok(IMGArguments {
|
||||||
color_depth: get_encoding(&job.settings.encoding),
|
color_depth: get_encoding(&job.settings.encoding),
|
||||||
clut_align: get_palette_rect(&job.palette_rect)?,
|
clut_align: get_palette_rect(&job.palette_rect)?,
|
||||||
semi_transparent,
|
semi_transparent,
|
||||||
|
|
Loading…
Reference in New Issue