sm64coopdx/docs/lua/examples/lighting-engine-demo/main.lua
PeachyPeach 467b22e939
Some checks failed
Build coop / build-ubuntu (push) Has been cancelled
Build coop / build-windows (push) Has been cancelled
Build coop / build-macos-arm (push) Has been cancelled
Build coop / build-macos-intel (push) Has been cancelled
Gfx set command: v2 + Gfx/Vtx dynamic alloc (#718)
* set_gfx_command part 2

* part 3

* get gfx/vtx from name; copy gfx/vtx

* gfx/vtx dynamic allocation lua

* gfx/vtx_new: don't take level/model/vanilla names

* Clean up gbi constants

* update example

* Isaac review; add gfx_get_next_command and vtx_get_next_vertex

* make all commands length 1; missing NULL checks
2025-04-12 18:19:14 -04:00

111 lines
No EOL
3.7 KiB
Lua

-- name: Lighting Engine Demo
-- description: Lighting Engine Demo\nBy \\#ec7731\\Agent X\n\n\\#dcdcdc\\Open the panel in the pause menu to see what you can do.
local flashlightColor = { 255, 255, 200 }
--- @param node GraphNode
function geo_hide_if_dnc(node)
local dl = cast_graph_node(node.next)
gfx_parse(dl.displayList, function(cmd, op)
if op == G_SETENVCOLOR then
gfx_set_command(cmd, "gsDPSetEnvColor(255, 255, 255, %i)", if_then_else(_G.dayNightCycleApi ~= nil and _G.dayNightCycleApi.is_dnc_enabled(), 0, 255))
end
end)
end
--- @param o Object
local function bhv_spawn_point_light(o)
local light = spawn_non_sync_object(
id_bhvPointLight,
E_MODEL_NONE,
o.oPosX, o.oPosY, o.oPosZ,
nil
)
if get_id_from_behavior(o.behavior) == id_bhvKoopaShell then
light.oBehParams = 0x00FF0032
else
light.oBehParams = 0xFFFFFF32
end
light.parentObj = o
end
--- @param o Object
function bhv_flashlight_loop(o)
local pos = gMarioStates[0].pos
local yaw = gFirstPersonCamera.yaw + 0x8000
o.oPosX = pos.x + sins(yaw) * 300
o.oPosY = pos.y + -gFirstPersonCamera.pitch * 0.06
o.oPosZ = pos.z + coss(yaw) * 300
le_set_light_pos(o.oLightID, o.oPosX, o.oPosY, o.oPosZ)
le_set_light_color(o.oLightID, flashlightColor[1], flashlightColor[2], flashlightColor[3])
end
local function spawn_flashlight()
local flashlight = spawn_non_sync_object(
bhvFlashlight,
E_MODEL_NONE,
0, 0, 0,
nil
)
flashlight.oBehParams = (flashlightColor[1] << 24) | (flashlightColor[2] << 16) | (flashlightColor[3] << 8) | (90)
return flashlight
end
--- @param flashlight Object
local function delete_flashlight(flashlight)
le_remove_light(flashlight.oLightID)
obj_mark_for_deletion(flashlight)
return nil
end
--- @param m MarioState
local function calculate_mario_lighting(m)
local color = { r = 0, g = 0, b = 0 }
local dir = { x = 0, y = 0, z = 0 }
le_calculate_lighting_color(m.pos, color, 0.25)
le_calculate_lighting_dir(m.pos, dir)
m.marioBodyState.lightR = color.r
m.marioBodyState.lightG = color.g
m.marioBodyState.lightB = color.b
m.marioBodyState.shadeR = m.marioBodyState.lightR * 0.5
m.marioBodyState.shadeG = m.marioBodyState.lightG * 0.5
m.marioBodyState.shadeB = m.marioBodyState.lightB * 0.5
m.marioBodyState.lightingDirX = -DEFAULT_LIGHTING_DIR + dir.x
m.marioBodyState.lightingDirY = -DEFAULT_LIGHTING_DIR + dir.y
m.marioBodyState.lightingDirZ = -DEFAULT_LIGHTING_DIR + dir.z
end
--- @param m MarioState
local function mario_update(m)
if m.playerIndex ~= 0 then return end
calculate_mario_lighting(m)
if (m.controller.buttonPressed & L_JPAD) ~= 0 then
audio_sample_play(SOUND_CUSTOM_FLASHLIGHT, m.pos, 1.0)
local flashlight = obj_get_first_with_behavior_id(bhvFlashlight)
if flashlight ~= nil then
delete_flashlight(flashlight)
else
spawn_flashlight()
end
end
end
local function on_set_flashlight_color(index, value)
flashlightColor[index + 1] = value
end
id_bhvKoopaShell = hook_behavior(id_bhvKoopaShell, OBJ_LIST_LEVEL, false, bhv_spawn_point_light, nil, "bhvKoopaShell")
hook_event(HOOK_MARIO_UPDATE, mario_update)
hook_mod_menu_slider("Flashlight Red", flashlightColor[1], 0, 255, on_set_flashlight_color)
hook_mod_menu_slider("Flashlight Green", flashlightColor[2], 0, 255, on_set_flashlight_color)
hook_mod_menu_slider("Flashlight Blue", flashlightColor[3], 0, 255, on_set_flashlight_color)
hook_mod_menu_button("Warp to Black Mesa", function() warp_to_level(LEVEL_HL, 1, 0) end)
hook_mod_menu_button("Warp to Sunset Canals", function() warp_to_level(LEVEL_CANALS, 1, 0) end)