Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

custom levels: refactor level building code and jak 2 support #3090

Merged
merged 13 commits into from Oct 21, 2023
22 changes: 22 additions & 0 deletions common/math/Vector.h
Expand Up @@ -18,6 +18,12 @@ class Vector {
return result;
}

static Vector<T, Size> unit(int idx) {
Vector<T, Size> result = Vector<T, Size>::zero();
result[idx] = T(1);
return result;
}

template <typename... Args>
constexpr Vector(Args... args) : m_data{T(args)...} {
static_assert(sizeof...(args) == Size, "Incorrect number of args");
Expand Down Expand Up @@ -226,6 +232,22 @@ class Vector {
}
}

Vector<T, Size> min(const Vector<T, Size>& other) const {
Vector<T, Size> result;
for (int i = 0; i < Size; i++) {
result[i] = std::min(m_data[i], other[i]);
}
return result;
}

Vector<T, Size> max(const Vector<T, Size>& other) const {
Vector<T, Size> result;
for (int i = 0; i < Size; i++) {
result[i] = std::max(m_data[i], other[i]);
}
return result;
}

std::string to_string_aligned() const {
std::string result = "[";
for (auto x : m_data) {
Expand Down
Expand Up @@ -10,7 +10,7 @@
// Must have vertex colors. Use the blender cycles renderer, bake, diffuse, uncheck color,
// and bake to vertex colors. For now, only the first vertex color group is used, so make sure you
// only have 1.
"gltf_file": "custom_levels/test-zone/test-zone2.glb",
"gltf_file": "custom_levels/jak1/test-zone/test-zone2.glb",

// automatically set wall vs. ground based on angle. Useful if you don't want to assign this yourself
"automatic_wall_detection": true,
Expand Down
83 changes: 83 additions & 0 deletions custom_levels/jak2/test-zone/test-zone.jsonc
@@ -0,0 +1,83 @@
{
// The "in-game" name of the level. Should be lower case, with dashes (GOAL symbol name)
// the name of this file, and the folder this file is in must have the same name.
"long_name": "test-zone",
// The file name, should be upper case and 8 characters or less.
"iso_name": "TESTZONE",
// The nickname, should be exactly 3 characters
"nickname": "tsz", // 3 char name, all lowercase
// Background mesh file.
// Must have vertex colors. Use the blender cycles renderer, bake, diffuse, uncheck color,
// and bake to vertex colors. For now, only the first vertex color group is used, so make sure you
// only have 1.
"gltf_file": "custom_levels/jak2/test-zone/test-zone2.glb",

// automatically set wall vs. ground based on angle. Useful if you don't want to assign this yourself
"automatic_wall_detection": true,
"automatic_wall_angle": 45.0,

// if your mesh has triangles with incorrect orientation, set this to make all collision mesh triangles double sided
// this makes collision 2x slower and bigger, so only use if really needed
"double_sided_collide": false,

// available res-lump tag data types:
// int32, float, meters, vector, vector4m (meters)
//
// examples:
//
// adds a float tag 'spring-height' with value of 200 meters (1 meter = 4096.0 units):
// "spring-height": ["meters", 200.0]
//
// adds a vector tag 'movie-pos':
// "movie-pos": ["vector", [4096000.0, -176128.0, 1353973.76, 1.0]]

// The base actor id for your custom level. If you have multiple levels, this should be unique!
"base_id": 100,

// All art groups you want to use in your custom level. Will add their models and corresponding textures to the FR3 file.
"art_groups": ["prsn-torture-ag"],

// Any textures you want to include in your custom level.
// This is mainly useful for textures which are not in the common level files and have no art group associated with them.
// To get a list of all the textures, you can extract all of the game's textures
// by setting "save_texture_pngs" to true in the decompiler config.
"textures": [],

"actors" : [
{
"trans": [-15.2818, 15.2461, 17.1360], // translation
"etype": "crate", // actor type
"game_task": 0, // associated game task (for powercells, etc)
"kill_mask": 0,
"quat": [0, 0, 0, 1], // quaternion
"bsphere": [-15.2818, 15.2461, 17.1360, 10], // bounding sphere
"lump": {
"name": "test-crate",
"eco-info": ["int32", 18, 2]
}
},

{
"trans": [-5.4630, 17.4553, 1.6169], // translation
"etype": "eco-yellow", // actor type
"game_task": 0, // associated game task (for powercells, etc)
"kill_mask": 0,
"quat": [0, 0, 0, 1], // quaternion
"bsphere": [-5.4630, 17.4553, 1.6169, 10], // bounding sphere
"lump": {
"name": "test-eco"
}
},

{
"trans": [-7.41, 13.5, 28.42], // translation
"etype": "prsn-torture", // actor type
"game_task": 0, // associated game task (for powercells, etc)
"quat": [0, 0, 0, 1], // quaternion
"bsphere": [-7.41, 13.5, 28.42, 10], // bounding sphere
"lump": {
"name": "test-torture"
}
}
]
}
Binary file added custom_levels/jak2/test-zone/test-zone2.glb
Binary file not shown.
9 changes: 9 additions & 0 deletions custom_levels/jak2/test-zone/testzone.gd
@@ -0,0 +1,9 @@
;; DGO definition file for Awful Village level
;; We use the convention of having a longer DGO name for levels without precomputed visibility.

;; the actual file name still needs to be 8.3
("TSZ.DGO"
(
"prison-obs.o"
"test-zone.go"
))
8 changes: 4 additions & 4 deletions goal_src/jak1/game.gp
Expand Up @@ -154,9 +154,9 @@
)

(defun custom-level-cgo (output-name desc-file-name)
"Add a CGO with the given output name (in $OUT/iso) and input name (in custom_levels/)"
"Add a CGO with the given output name (in $OUT/iso) and input name (in custom_levels/jak1/)"
(let ((out-name (string-append "$OUT/iso/" output-name)))
(defstep :in (string-append "custom_levels/" desc-file-name)
(defstep :in (string-append "custom_levels/jak1/" desc-file-name)
:tool 'dgo
:out `(,out-name)
)
Expand Down Expand Up @@ -208,7 +208,7 @@
)

(defmacro build-custom-level (name)
(let* ((path (string-append "custom_levels/" name "/" name ".jsonc")))
(let* ((path (string-append "custom_levels/jak1/" name "/" name ".jsonc")))
`(defstep :in ,path
:tool 'build-level
:out '(,(string-append "$OUT/obj/" name ".go")))))
Expand Down Expand Up @@ -1636,7 +1636,7 @@
;;;;;;;;;;;;;;;;;;;;;;;;;

;; Set up the build system to build the level geometry
;; this path is relative to the custom_levels/ folder
;; this path is relative to the custom_levels/jak1 folder
;; it should point to the .jsonc file that specifies the level.
(build-custom-level "test-zone")
;; the DGO file
Expand Down
87 changes: 86 additions & 1 deletion goal_src/jak2/engine/level/level-info.gc
Expand Up @@ -14690,7 +14690,7 @@
0
)

;; added in PC port: test levels from the ps3 version
;; og:preserve-this added in PC port: test levels from the ps3 version
(#when USE_PS3_LEVELS
(define 4aaron (new 'static 'level-load-info
:index 1
Expand Down Expand Up @@ -15724,3 +15724,88 @@
(cons! *level-load-list* 'wasall)
(cons! *level-load-list* 'stadocc)
)

;; og:preserve-this added test-zone level
(define test-zone
(new 'static 'level-load-info
:index #x9e
:name 'test-zone
:visname 'test-zone-vis
:nickname 'tsz
:dbname 'test-zone
:taskname 'default
:packages '()
;; :memory-mode (load-buffer-mode small-center)
:music-bank #f
:ambient-sounds '()
:mood-func 'update-mood-default
:mood-init #f
:ocean #f
:sky #t
:use-camera-other #f
:part-engine-max 16
:continues '((new 'static 'continue-point
:name "test-zone-start"
:level 'test-zone
:trans (new 'static 'vector :x 0.0 :y (meters 10) :z (meters 10) :w 1.0)
:quat (new 'static 'vector :y 0.061 :w 0.9981)
:camera-trans (new 'static 'vector :x 0.0 :y (meters 1) :z 0.0 :w 1.0)
:camera-rot (new 'static 'inline-array vector3s 3
(new 'static 'vector3s :data (new 'static 'array float 3 1.0 0.0 0.0))
(new 'static 'vector3s :data (new 'static 'array float 3 0.0 1.0 0.0))
(new 'static 'vector3s :data (new 'static 'array float 3 0.0 0.0 1.0))
)
:on-goto #f
:vis-nick #f
:want (new 'static 'inline-array level-buffer-state 6
(new 'static 'level-buffer-state :name 'test-zone :display? 'display :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name 'ctywide :display? 'display :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name #f :display? #f :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name #f :display? #f :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name #f :display? #f :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name #f :display? #f :force-vis? #f :force-inside? #f)
)
:want-sound (new 'static 'array symbol 3 #f #f #f)
)
)
:tasks '()
:priority 100
:load-commands '()
:alt-load-commands '()
:bsp-mask #xffffffffffffffff
:buttom-height (meters -10000000)
:run-packages '()
:wait-for-load #t
:login-func #f
:activate-func #f
:deactivate-func #f
:kill-func #f
:borrow-level (new 'static 'array symbol 2 #f #f)
:borrow-display? (new 'static 'array symbol 2 #f #f)
:base-task-mask (task-mask task0)
:texture-anim-tfrag #f
:texture-anim-pris #f
:texture-anim-shrub #f
:texture-anim-alpha #f
:texture-anim-water #f
:texture-anim-twarp #f
:texture-anim-pris2 #f
:texture-anim-sprite #f
:texture-anim-map #f
:texture-anim-sky #f
:draw-priority 10.0
:fog-height 327680.0
:bigmap-id (bigmap-id bigmap-id-20)
:ocean-near-translucent? #t
:ocean-far? #t
:mood-range (new 'static 'mood-range :data (new 'static 'array float 4 0.0 1.0 0.0 1.0))
:max-rain 1.0
:fog-mult 1.0
:ocean-alpha 1.0
:extra-sound-bank #f
)
)

(#when PC_PORT
(cons! *level-load-list* 'test-zone)
)
3 changes: 2 additions & 1 deletion goal_src/jak2/engine/target/target-death.gc
Expand Up @@ -262,7 +262,8 @@
)
)
(let ((s5-4 (level-get *level* (-> arg0 level))))
(when s5-4
;; og:preserve-this don't wait for vis if level doesn't have it
(when (and s5-4 (-> s5-4 vis-info 0))
(while (and (-> *level* vis?) (-> s5-4 vis-info 0) (= (-> s5-4 all-visible?) 'loading))
(suspend)
)
Expand Down
11 changes: 11 additions & 0 deletions goal_src/jak2/game.gp
Expand Up @@ -291,6 +291,17 @@
(cgo-file "wasall.gd" common-dep)
)

;;;;;;;;;;;;;;;;;;;;;;;;;
;; Example Custom Level
;;;;;;;;;;;;;;;;;;;;;;;;;

;; Set up the build system to build the level geometry
;; this path is relative to the custom_levels/jak2 folder
;; it should point to the .jsonc file that specifies the level.
(build-custom-level "test-zone")
;; the DGO file
(custom-level-cgo "TSZ.DGO" "test-zone/testzone.gd")

;;;;;;;;;;;;;;;;;;;;;
;; ANIMATIONS
;;;;;;;;;;;;;;;;;;;;;
Expand Down
17 changes: 17 additions & 0 deletions goal_src/jak2/lib/project-lib.gp
Expand Up @@ -83,6 +83,17 @@
)
)

(defun custom-level-cgo (output-name desc-file-name)
"Add a CGO with the given output name (in $OUT/iso) and input name (in custom_levels/jak2/)"
(let ((out-name (string-append "$OUT/iso/" output-name)))
(defstep :in (string-append "custom_levels/jak2/" desc-file-name)
:tool 'dgo
:out `(,out-name)
)
(set! *all-cgos* (cons out-name *all-cgos*))
)
)

(defun cgo (output-name desc-file-name)
"Add a CGO with the given output name (in $OUT/iso) and input name (in goal_src/jak2/dgos)"
(let ((out-name (string-append "$OUT/iso/" output-name)))
Expand Down Expand Up @@ -124,6 +135,12 @@
)
)

(defmacro build-custom-level (name)
(let* ((path (string-append "custom_levels/jak2/" name "/" name ".jsonc")))
`(defstep :in ,path
:tool 'build-level2
:out '(,(string-append "$OUT/obj/" name ".go")))))

(defmacro group (name &rest stuff)
`(defstep :in ""
:tool 'group
Expand Down
35 changes: 23 additions & 12 deletions goalc/CMakeLists.txt
Expand Up @@ -5,18 +5,26 @@ add_library(compiler
emitter/ObjectGenerator.cpp
emitter/Register.cpp
debugger/disassemble.cpp
build_level/build_level.cpp
build_level/collide_bvh.cpp
build_level/collide_drawable.cpp
build_level/collide_pack.cpp
build_level/color_quantization.cpp
build_level/Entity.cpp
build_level/FileInfo.cpp
build_level/gltf_mesh_extract.cpp
build_level/LevelFile.cpp
build_level/ResLump.cpp
build_level/Tfrag.cpp
build_level/ambient.cpp
build_level/common/build_level.cpp
build_level/jak1/build_level.cpp
build_level/jak2/build_level.cpp
build_level/collide/jak1/collide_bvh.cpp
build_level/collide/jak1/collide_drawable.cpp
build_level/collide/jak1/collide_pack.cpp
build_level/collide/jak2/collide.cpp
build_level/common/color_quantization.cpp
build_level/common/Entity.cpp
build_level/jak1/Entity.cpp
build_level/jak2/Entity.cpp
build_level/common/FileInfo.cpp
build_level/jak1/FileInfo.cpp
build_level/jak2/FileInfo.cpp
build_level/common/gltf_mesh_extract.cpp
build_level/jak1/LevelFile.cpp
build_level/jak2/LevelFile.cpp
build_level/common/ResLump.cpp
build_level/common/Tfrag.cpp
build_level/jak1/ambient.cpp
compiler/Compiler.cpp
compiler/Env.cpp
compiler/Val.cpp
Expand Down Expand Up @@ -65,6 +73,9 @@ endif ()
add_executable(goalc main.cpp)
add_executable(goalc-simple simple_main.cpp)

add_executable(build_level build_level/main.cpp)

target_link_libraries(goalc common Zydis compiler)
target_link_libraries(goalc-simple common Zydis compiler)
target_link_libraries(build_level common Zydis compiler)