AABB metrics, player spawntpoint and spawn player when playing. More todo.

main
Cameron Murphy Reikes 7 months ago
parent 00186f233f
commit b23078f219

@ -811,6 +811,14 @@ float max_coord(Vec2 v)
return v.x > v.y ? v.x : v.y;
}
AABB grow_from_ml(Vec2 ml, Vec2 offset, Vec2 size) {
AABB ret;
ret.upper_left = AddV2(AddV2(ml, offset), V2(0.0f, size.y/2.0f));
ret.lower_right = AddV2(ret.upper_left, V2(size.x, -size.y));
return ret;
}
// aabb advice by iRadEntertainment
Vec2 entity_aabb_size(Entity *e)
{
@ -1149,7 +1157,7 @@ Transform lerp_transforms(Transform from, float t, Transform to)
}
Transform default_transform()
{
return (Transform){.rotation = Make_Q(0,0,0,1)};
return (Transform){.rotation = Make_Q(0,0,0,1), .scale = V3(1,1,1)};
}
typedef struct
@ -1574,6 +1582,7 @@ int num_rooms(ThreeDeeLevel *level) {
}
Entity *npcs_entity(NpcKind kind) {
if(kind == NPC_nobody) return 0;
Entity *ret = 0;
ENTITIES_ITER(gs.entities)
{
@ -3535,6 +3544,7 @@ Vec2 screen_size()
return V2((float)sapp_width(), (float)sapp_height());
}
typedef struct Camera
{
Vec2 pos;
@ -3643,6 +3653,10 @@ AABB aabb_at(Vec2 at, Vec2 size)
};
}
AABB screen_aabb() {
return aabb_at(V2(0.0, screen_size().y), screen_size());
}
AABB aabb_at_yplusdown(Vec2 at, Vec2 size)
{
return (AABB) {
@ -4458,6 +4472,33 @@ AABB draw_centered_text(TextParams t)
return draw_text(t);
}
typedef struct
{
Vec2 ul; // upper left
Vec2 um; // upper middle
Vec2 ur; // upper right
Vec2 mr; // middle right
Vec2 lr; // lower right
Vec2 lm; // lower middle
Vec2 ll; // lower left
Vec2 ml; // middle left
} AABBStats;
AABBStats stats(AABB aabb) {
Vec2 size = aabb_size(aabb);
return (AABBStats) {
.ul = aabb.upper_left,
.um = AddV2(aabb.upper_left, V2(size.x/2.0f, 0.0)),
.ur = AddV2(aabb.upper_left, V2(size.x, 0.0)),
.mr = AddV2(aabb.lower_right, V2(0.0, size.y/2.0f)),
.lr = aabb.lower_right,
.lm = AddV2(aabb.lower_right, V2(-size.x/2.0f, 0.0)),
.ll = AddV2(aabb.lower_right, V2(-size.x, 0.0)),
.ml = AddV2(aabb.upper_left, V2(0.0, -size.y/2.0f)),
};
}
int sorting_key_at(Vec2 pos)
{
return -(int)pos.y;
@ -5580,6 +5621,9 @@ void frame(void)
if(gs.edit.enabled) {
cam_target_pos.x = gs.edit.camera_panning.x;
cam_target_pos.z = gs.edit.camera_panning.y;
} else if(gs.player) {
cam_target_pos.x = gs.player->pos.x;
cam_target_pos.z = gs.player->pos.y;
}
//dbgline(V2(0,0), V2(500, 500));
const float vertical_to_horizontal_ratio = CAM_VERTICAL_TO_HORIZONTAL_RATIO;
@ -5622,7 +5666,7 @@ void frame(void)
Vec3 light_dir;
{
float t = 0.0f;
float t = 0.3f;
Vec3 sun_vector = V3(2.0f*t - 1.0f, sinf(t*PI32)*0.8f + 0.2f, 0.8f); // where the sun is pointing from
light_dir = NormV3(MulV3F(sun_vector, -1.0f));
}
@ -5864,13 +5908,16 @@ void frame(void)
}
// @Place(UI rendering that happens before gameplay processing so can consume events before the gameplay needs them)
PROFILE_SCOPE("Editor UI Rendering")
PROFILE_SCOPE("Editor Rendering")
{
if(keypressed[SAPP_KEYCODE_TAB]) {
gs.edit.enabled = !gs.edit.enabled;
}
if(gs.edit.enabled) {
draw_text((TextParams){false, S8Lit("Editing"), V2(0,0), WHITE, .scale = 1.0f, .use_font = &font_for_text_input});
if(get_cur_room(&gs, &level_threedee)->roomid == gs.edit.player_spawn_roomid) {
draw_thing((DrawnThing){&mesh_spawnring, .t = (Transform){.offset = plane_point(gs.edit.player_spawn_position), .rotation = Make_Q(0,0,0,1),.scale = V3(1,1,1)}});
}
LoadedFont room_name_font = font_for_text_input;
float max_room_name_width = 0.0f;
@ -5911,6 +5958,18 @@ void frame(void)
gs.edit.camera_panning_target = AddV2(gs.edit.camera_panning_target, point_plane(mouse_movement_on_plane));
}
if (imbutton(grow_from_ml(stats(screen_aabb()).ml, V2(10.0f,0.0f), V2(200.0f, 60.0f)), 1.0f, S8Lit("Set Player Spawn"))) {
gs.edit.placing_spawn = true;
}
if(gs.edit.placing_spawn) {
gs.edit.player_spawn_position = point_plane(point_on_plane_from_camera_point(view, mouse_pos));
gs.edit.player_spawn_roomid = get_cur_room(&gs, &level_threedee)->roomid;
if(pressed.mouse_down) {
gs.edit.placing_spawn = false;
}
}
// characters sidebar
{
float screen_margin = 10.0f;
@ -5960,8 +6019,8 @@ void frame(void)
}
Entity *placing = npcs_entity(gs.edit.placing_npc);
if(placing) {
Log("%llu\n", placing->current_roomid);
placing->pos = point_plane(point_on_plane_from_camera_point(view, mouse_pos));
placing->current_roomid = cur_room->roomid;
if(pressed.mouse_down) {
gs.edit.placing_npc = NPC_nobody;
}
@ -5971,6 +6030,7 @@ void frame(void)
gs.edit.camera_panning = LerpV2(gs.edit.camera_panning, unwarped_dt * 19.0f, gs.edit.camera_panning_target);
}
}
PROFILE_SCOPE("Entity UI Rendering")
{
ENTITIES_ITER(gs.entities)
@ -6105,6 +6165,14 @@ void frame(void)
gs.tick += 1;
if(!gs.edit.enabled && gs.player == 0) {
gs.player = new_entity(&gs);
gs.player->is_player = true;
gs.player->is_npc = true;
gs.player->current_roomid = gs.edit.player_spawn_roomid;
gs.player->pos = gs.edit.player_spawn_position;
}
// process gs.entities process entities
PROFILE_SCOPE("entity processing")
{

@ -291,6 +291,10 @@ typedef struct EditorState {
Vec2 camera_panning_target;
Vec2 camera_panning;
NpcKind placing_npc;
bool placing_spawn;
u64 player_spawn_roomid;
Vec2 player_spawn_position;
} EditorState;
typedef struct GameState {

@ -3,6 +3,17 @@ Handmade Seattle Requirements:
- clear objective that's physical, not metaphysical
- music, fancy headphones
Todo List 10/2/2023:
- Working character anims with multiple npcs.
- Saving and loading working well enough to edit levels.
- Edit character brain UI, basic stuff at first.
- Change AI system to the memory fewer message thing tried out in the openai platform
- Items you can pick up, use, and throw. Add alcohol item. This makes the characters woozy optionally.
- Characters and player walking between rooms.
- Build out bill, jack, and jane. Get some interactions there.
Send this build to discord.
My estimated time of completion for all of these, as of 10/2/2023, is 5 days. So new build on 10/7/2023
Urgent:
- angel doesn't have characters near you

Loading…
Cancel
Save