From 5237c1e543acd67d8e4696c1fccc56bf4eb359db Mon Sep 17 00:00:00 2001 From: hgn Date: Fri, 13 Dec 2024 01:52:42 +0000 Subject: [PATCH] read camera from metascene --- content_skaterift/metascenes/test_scene.ms | Bin 47448 -> 47592 bytes skaterift_blender/sr_mdl.py | 2 +- skaterift_blender/sr_metascene.py | 17 +++ src/metascene.c | 121 +++++++++------------ src/metascene.h | 1 + src/skaterift.c | 4 + 6 files changed, 74 insertions(+), 71 deletions(-) diff --git a/content_skaterift/metascenes/test_scene.ms b/content_skaterift/metascenes/test_scene.ms index 3f9eba06222265404e283f327d080c1b1a4a99f3..838c7f2c462b3bc3ac62a5db46ac5c6971e4141d 100644 GIT binary patch delta 6364 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 delta 6235 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 diff --git a/skaterift_blender/sr_mdl.py b/skaterift_blender/sr_mdl.py index 16cdaea..79c2be9 100644 --- a/skaterift_blender/sr_mdl.py +++ b/skaterift_blender/sr_mdl.py @@ -611,7 +611,7 @@ def _mdl_compiler_compile_entities(): cam.co[1] = trans.co[1] cam.co[2] = trans.co[2] - cam.fov = obj.data.angle * 45.0 + cam.fov = obj.data.angle_y * 57.2958 sr_ent_push(cam) #} elif ent_type == 'ent_gate': #{ diff --git a/skaterift_blender/sr_metascene.py b/skaterift_blender/sr_metascene.py index 94e587a..34f46ab 100644 --- a/skaterift_blender/sr_metascene.py +++ b/skaterift_blender/sr_metascene.py @@ -239,6 +239,12 @@ def _metascene_compile_action_curves( out_strip, action ): mul = [1,1,-1][ index ] #} + if name == 'rotation_euler': + #{ + index = [1,0,2][ index ] + mul = -1 + #} + id = F"{name}:{index}" print( F" Appending curve '{id}'" ) @@ -433,6 +439,17 @@ def _sr_export_metascene( path ): for marker in bpy.context.scene.timeline_markers: #{ print( F"Marker {marker.name}: {marker.camera}" ) + out_strip = ms_strip() + out_strip.data_start = 0 + out_strip.data_count = 0 + out_strip.data_mode = 2 + out_strip.offset = marker.frame + out_strip.length = 0 + out_strip.pstr_name = _af_pack_string( marker.name ) + out_strip.pstr_internal_name = 0 + out_strip.instance_id = 0xffffffff + out_strip.object_id = sr_entity_id( marker.camera ) + _ms_compiler.strips.append( out_strip ) #} _ms_compiler.strips.sort( key=lambda s: s.offset ) diff --git a/src/metascene.c b/src/metascene.c index b3a932f..40eed04 100644 --- a/src/metascene.c +++ b/src/metascene.c @@ -85,6 +85,8 @@ struct samplers[32]; u32 active_samplers; + ent_camera *active_camera; + u32 strip; f32 time; } @@ -498,6 +500,11 @@ f32 explicit_bezier( f32 A[2], f32 B[2], f32 C[2], f32 D[2], f32 x ) + A[1] * (-1.0f*t3 + 3.0f*t2 - 3.0f*tc + 1.0f); } +ent_camera *_cutscene_active_camera(void) +{ + return _cutscene.active_camera; +} + void cutscene_update( f32 delta ) { _cutscene.time += delta; @@ -544,6 +551,24 @@ void cutscene_update( f32 delta ) continue; } + if( strip->data_mode == 2 ) + { + if( strip->object_id ) + { + struct cs_asoc asoc; + _cutscene_get_strip_asoc( strip, &asoc ); + + VG_ASSERT( asoc.entity_type == k_ent_camera ); + ent_camera *cam = + af_arritm( &_cutscene.meta.cameras, asoc.entity_index ); + + _cutscene.active_camera = cam; + } + else + _cutscene.active_camera = NULL; + } + else + { if( strip->instance_id == 0xffffffff ) { /* internal link */ @@ -611,7 +636,8 @@ void cutscene_update( f32 delta ) samp->override = asoc.override; } } - + } + _cutscene.strip ++; } @@ -685,75 +711,6 @@ void cutscene_update( f32 delta ) if( kl && kr ) { -#if 0 - f32 A = kl->co[0], - D = kr->co[0], - L = D-A, - B = (kl->r[0] - A) / L, - C = (kr->l[0] - A) / L, - a = 1.0f + 3.0f*B - 3.0f*C, - b = -6.0f*B + 3.0f*C, - c = 3.0f*B, - d = -(t - A) / L; - -/* ILLINOIS */ - f32 fa = d, - fb = a+b+c+d, - xMin = 0.0f, - xMax = 1.0f, - e,x1; - - for( u32 j=0; j<6; j ++ ) - { - x1 = xMax - fb*(xMax-xMin)/(fb-fa); - e = x1*x1*x1*a + x1*x1*b + x1*c + d; - - if( fabsf(e) < 0.0001f ) - break; - - if( fb*e < 0.0f ) - { - xMin = xMax; - fa = fb; - } - else - fa = fa*0.5f; - - xMax = x1; - fb = e; - } - -/* BISECTION */ -#if 0 - /* One day I will have my revenge on cubics I swear */ - f32 x1 = 0.5f, - xMin = 0.0f, - xMax = 1.0f, - e; - for( u32 j=0; j<16; j ++ ) - { - e = x1*x1*x1*a + x1*x1*b + x1*c + d; - if( e > 0.0f ) xMax = x1; - else xMin = x1; - x1 = (xMin+xMax)*0.5f; - } -#endif - - if( samp->curves.semantic == CS_LOCATION+1 ) - vg_info( "convergence: %.9f\n", e ); - - f32 x2 = x1*x1, - x3 = x2*x1, - Ay = kl->co[1], - By = kl->r[1], - Cy = kr->l[1], - Dy = kr->co[1], - y = Dy*x3 - + Cy*(-3.0f*x3 + 3.0f*x2) - + By*( 3.0f*x3 - 6.0f*x2 + 3.0f*x1) - + Ay*(-x3 + 3.0f*x2 - 3.0f*x1 + 1.0f ); -#endif - *samp->curves.target = explicit_bezier( kl->co, kl->r, kr->l, kr->co, t ); } @@ -761,6 +718,13 @@ void cutscene_update( f32 delta ) { *samp->curves.target = kl->co[1]; } + + if( samp->curves.semantic == CS_FOV ) + { + f32 mm = *samp->curves.target, + fov = 2.0f * 57.2957795f * atanf( (36.0f*0.5f) / mm ); + *samp->curves.target = fov; + } } } @@ -797,6 +761,23 @@ static void cb_cutscene_view( ui_context *ctx, ui_rect rect, for( u32 i=0; idata_mode == 2 ) + { + ui_rect box = { root[0] + strip->offset, root[1], 1, rect[3]-16 }; + ui_fill( ctx, box, 0xff00ff00 ); + + box[1] += box[3] -16; + box[2] = 200; + box[3] = 16; + + if( ui_clip( rect, box, box ) ) + { + ui_text( ctx, box, af_str( &_cutscene.meta.af, strip->pstr_name ), + 1, k_ui_align_middle_left, 0 ); + } + continue; + } u32 layer = 0; for( u32 k=0; k