Skip to content

Commit

Permalink
Move functionality to modules and add prim read and extract examples
Browse files Browse the repository at this point in the history
  • Loading branch information
dbierek committed Jun 20, 2024
1 parent e740a2e commit 8836e37
Show file tree
Hide file tree
Showing 23 changed files with 586 additions and 3,068 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
/target
/objects
/objects
/output
101 changes: 0 additions & 101 deletions .vscode/launch.json

This file was deleted.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ extended-tea = "0.1.1"
byteorder = "1.5.0"
rayon = { version = "1.10.0", optional = true}
serde = { version = "1.0.199", optional = true, features = ["derive"] }
serde_json = { version = "1.0.117"}
serde-hex = { version = "0.1.0", optional = true }
tungstenite = { version = "0.16.0", features = ["native-tls"]}
url = "2.2.2"
Expand Down
62 changes: 6 additions & 56 deletions examples/connect_to_game.rs
Original file line number Diff line number Diff line change
@@ -1,63 +1,13 @@
use std::{env, fs};
use std::fs::OpenOptions;
use std::io::prelude::*;
use std::env;

use glacier2obj::connect::game_connection::GameConnection;

use tungstenite::{connect, Message};
use url::Url;

pub fn main() {
let args: Vec<String> = env::args().collect();
if args.len() < 2 {
eprintln!("Usage: cargo run -- example connect_to_game <in_file> <out_file>");
eprintln!("Usage: cargo run -- example connect_to_game <path to a to_find.json file> <path to an output prims.json file>");
return;
}
println!("Connecting to game on port 46735");

let (mut socket, _response) = connect(
Url::parse("ws://localhost:46735/socket").unwrap()
).expect("Can't connect");

let _ = socket.write_message(Message::Text(r#"{"type":"hello","identifier":"glacier2obj"}"#.into()));
let message = fs::read_to_string(args[1].as_str()).expect(format!("Error opening {}. Run a scan to generate this file", args[1].as_str()).as_str());

let _ = socket.write_message(Message::Text(message.into()));

fs::write(args[2].as_str(), "").expect(format!("Error writing to {}", args[2].as_str()).as_str());

let mut out_file = OpenOptions::new()
.write(true)
.append(true)
.open(args[2].as_str())
.unwrap();

let mut welcome_received: bool = false;
let mut is_first: bool = true;

loop {
let msg = socket.read_message().expect("Error reading message");
if msg.to_string().as_str() == "Done sending entities." {
println!("Received Done message. Finalizing json output and exiting.");
if let Err(e) = writeln!(out_file, "]}}") {
eprintln!("Couldn't write to file: {}", e);
}
break
}
if welcome_received {
if !is_first {
if let Err(e) = writeln!(out_file, ",") {
eprintln!("Couldn't write to file: {}", e);
}
} else {
is_first = false;
}
if let Err(e) = write!(out_file, "{}", msg) {
eprintln!("Couldn't write to file: {}", e);
}
} else {
if let Err(e) = write!(out_file, r#"{{"entities":["#) {
eprintln!("Couldn't write to file: {}", e);
}
welcome_received = true;
}
}
}
GameConnection::get_prim_list_from_game(args[1].as_str(), args[2].as_str());
}
22 changes: 22 additions & 0 deletions examples/extract_prims.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
use glacier2obj::extract::prim_extraction::PrimExtraction;
use glacier2obj::json_serde::prims_json::PrimsJson;
use glacier2obj::package::package_scan::PackageScan;
use std::env;

fn main() {
let args: Vec<String> = env::args().collect();

if args.len() < 6 {
eprintln!("Usage: cargo run --example extract_prims -- <path to a Retail directory> <path to a Runtime directory> <game version (H2016 | HM2 | HM3)> <path to a prims.json file> <path to output directory>");
return;
}
let prims_json = PrimsJson::build_from_prims_file(args[4].clone());
let needed_prim_hashes = PrimExtraction::get_needed_prim_hashes(&prims_json, args[5].clone());
if needed_prim_hashes.is_empty() {
println!("All prim files already exist. Skipping extraction.");
return;
}
println!("Extracting {} prims.", needed_prim_hashes.len());
let partition_manager = PackageScan::scan_packages(args[1].clone(), args[3].clone()).unwrap();
PrimExtraction::extract_prims(args[2].clone(), needed_prim_hashes, &partition_manager, args[5].clone());
}
13 changes: 13 additions & 0 deletions examples/read_prims.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
use glacier2obj::json_serde::prims_json::PrimsJson;
use std::env;

fn main() {
let args: Vec<String> = env::args().collect();

if args.len() < 2 {
eprintln!("Usage: cargo run --example read_prims -- <path to a prims.json file>");
return;
}
let mut prims_json: PrimsJson = PrimsJson::build_from_prims_file(args[1].clone());
prims_json.output_prims();
}
9 changes: 5 additions & 4 deletions examples/scan_scenario.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::env;

use glacier2obj::scanner::scenario_scan::ScenarioScan;
use glacier2obj::{package::package_scan::PackageScan, scenario::scenario_scan::ScenarioScan};

// Based on mount_game_files example from rpkg-rs
pub fn main() {
Expand All @@ -9,8 +9,9 @@ pub fn main() {
eprintln!("Usage: cargo run -- example scan_scenario <path to a Retail directory> <game version (H2016 | HM2 | HM3)> <ioi string or hash> <path to a hashlist> <path to output file>");
return;
}
let mut scan: ScenarioScan = ScenarioScan::new(args[1].clone(), args[2].clone(), args[3].clone(), args[4].clone());
scan.scan_scenario();
let mut scan: ScenarioScan = ScenarioScan::new(args[3].clone(), args[4].clone());
let partition_manager = PackageScan::scan_packages(args[1].clone(), args[2].clone()).unwrap();

scan.scan_scenario(&partition_manager);
scan.output_to_file(args[5].clone());
return;
}
4 changes: 2 additions & 2 deletions glacier2obj.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
from mathutils import Euler
import math

path_to_obj_dir = os.path.join('D:\\workspace\\glacier2obj\\objects\\OBJ\\')
path_to_obj_dir = os.path.join('D:\\workspace\\glacier2obj\\output\\obj\\')
file_list = sorted(os.listdir(path_to_obj_dir))
obj_list = [item for item in file_list if item.endswith('.obj')]
path_to_prims_json = os.path.join('D:\\workspace\\glacier2obj\\prims.json');
path_to_prims_json = os.path.join('D:\\workspace\\glacier2obj\\output\\prims.json');
f = open (path_to_prims_json, "r")
data = json.loads(f.read())
print("Printing hashes and transforms")
Expand Down
6 changes: 6 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 8836e37

Please sign in to comment.