Skip to content

Commit

Permalink
custom levels: refactor level building code and jak 2 support (#3090)
Browse files Browse the repository at this point in the history
Co-authored-by: water <[email protected]>
  • Loading branch information
Hat-Kid and water111 authored Oct 21, 2023
1 parent dccc3da commit c7c615a
Show file tree
Hide file tree
Showing 60 changed files with 3,048 additions and 430 deletions.
22 changes: 22 additions & 0 deletions common/math/Vector.h
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
File renamed without changes.
File renamed without changes.
83 changes: 83 additions & 0 deletions custom_levels/jak2/test-zone/test-zone.jsonc
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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)

Loading

0 comments on commit c7c615a

Please sign in to comment.