Changeset 486
- Timestamp:
- 02/24/16 18:47:54 (9 years ago)
- Location:
- trunk
- Files:
-
- 5 added
- 31 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv.lua
r484 r486 117 117 if _ACTION == "gmake-clang" then 118 118 buildoptions { 119 "-std=c++1 1",119 "-std=c++1z", 120 120 -- -- on Mac OS X don't try to use old stdc++ 121 121 -- "-stdlib=libc++", 122 122 "-Weverything", 123 -- math is so much easier with these 124 "-Wno-gnu-anonymous-struct", 125 "-Wno-nested-anon-types", 123 126 -- obviously we don't care about C++98 compatibility 124 127 "-Wno-c++98-compat", -
trunk/nv/base/common.hh
r471 r486 266 266 constexpr T narrow_cast( const U& a ) 267 267 { 268 NV_MSVC_SUPRESS( 4806 ); 268 269 return static_cast<T>( a & static_cast<T>( -1 ) ); 269 270 } -
trunk/nv/core/transform.hh
r485 r486 17 17 { 18 18 public: 19 typedef float value_type; 20 19 21 transform() {} 20 22 explicit transform( const vec3& a_position ) : m_position( a_position ) {} … … 106 108 template <> struct type_to_enum< transform > { static const datatype type = TRANSFORM; }; 107 109 110 namespace math 111 { 112 113 inline transform lerp( const transform& a, const transform& b, float value ) 114 { 115 return transform( 116 math::lerp( a.get_position(), b.get_position(), value ), 117 math::lerp( a.get_orientation(), b.get_orientation(), value ) 118 ); 119 } 120 121 } 122 108 123 } 109 124 -
trunk/nv/engine/animation.hh
r485 r486 17 17 #include <nv/core/resource.hh> 18 18 #include <nv/interface/mesh_data.hh> 19 #include <nv/interface/easing.hh> 19 20 #include <nv/gfx/skeleton_instance.hh> 20 21 #include <nv/gfx/poses.hh> 22 #include <nv/engine/resource_system.hh> 21 23 22 24 namespace nv 23 25 { 24 26 class animator_bind_data; 25 classanimator_data;27 struct animator_data; 26 28 } 27 29 … … 33 35 { 34 36 35 struct animator_clip_data 36 { 37 uint32 id; 38 frame_range range; 39 }; 40 41 class animator_data 37 struct animator_pose_data 38 { 39 uint32 pose; 40 // float time; 41 // float easing_data[4]; 42 }; 43 44 struct animator_transition_data 45 { 46 uint32 target; 47 float duration; 48 interpolation interp; 49 easing easing; 50 }; 51 52 typedef hash_store< shash64, animator_transition_data > animator_transition_table; 53 54 struct animator_state_data 55 { 56 shash64 name; 57 uint32 base_pose; 58 vector< animator_pose_data > poses; 59 bool loop; 60 float duration; 61 interpolation interp; 62 animator_transition_table transitions; 63 }; 64 65 struct animator_layer_data 66 { 67 shash64 name; 68 sint32 def_state; 69 sint32 mask; 70 vector< bool > mask_vector; 71 vector< animator_state_data > states; 72 }; 73 74 struct animator_data 75 { 76 vector< animator_layer_data > layers; 77 pose_data_set* poses; 78 }; 79 80 struct animator_transition_instance : animator_transition_data 81 { 82 uint32 source; 83 float time; 84 85 animator_transition_instance() {} 86 87 animator_transition_instance( const animator_transition_data& data, uint32 source ) 88 : animator_transition_data( data ), source( source ), time( 0.0f ) 89 { 90 91 } 92 }; 93 94 class animator_layer_instance 42 95 { 43 96 public: 44 animator_data( pose_data_set* data ) : m_data( data ) {} 45 // 46 pose_data_set* get_pose_data() { return m_data; } 47 const pose_data_set* get_pose_data() const { return m_data; } 48 49 const animator_clip_data* get_clip( shash64 name ) const 50 { 51 auto it = m_clip_data.find( name ); 52 return ( it != m_clip_data.end() ? &it->second : nullptr ); 53 } 54 bool has_clip( shash64 name ) const 55 { 56 auto it = m_clip_data.find( name ); 57 return it != m_clip_data.end(); 58 } 59 void add_clip( shash64 name, animator_clip_data&& entry ) 60 { 61 m_clip_data.assign( name, entry ); 62 } 63 protected: 64 pose_data_set* m_data; 65 hash_store< shash64, animator_clip_data > m_clip_data; 97 vector< animator_transition_instance > m_transitions; 98 uint32 m_current_state; 99 float m_time; 100 101 animator_layer_instance() : m_current_state( 0 ), m_time( 0.0f ) {} 102 void set_state( uint32 state ) { m_current_state = state; } 103 uint32 get_state() const { return m_current_state; } 104 uint32 get_final_state() const 105 { 106 if ( m_transitions.size() > 0 ) 107 return m_transitions.back().target; 108 return m_current_state; 109 } 110 void add_transition( const animator_transition_data& data, uint32 source ) 111 { 112 if ( m_transitions.size() > 0 ) 113 { 114 auto& last = m_transitions.back(); 115 if ( last.target == source && data.target == last.source ) 116 { 117 nv::swap( last.target, last.source ); 118 last.time = last.duration - last.time; 119 return; 120 } 121 } 122 m_transitions.push_back( animator_transition_instance( data, source ) ); 123 } 124 void reset() 125 { 126 m_transitions.clear(); 127 m_time = 0.0f; 128 } 129 void update( float dtime ) 130 { 131 if ( m_current_state != -1 ) 132 { 133 float time = dtime; 134 while ( m_transitions.size() > 0 ) 135 { 136 animator_transition_instance& tr = m_transitions.front(); 137 m_current_state = tr.target; 138 tr.time += time; 139 if ( tr.time < tr.duration ) break; 140 time -= ( tr.time - tr.duration ); 141 m_transitions.erase( m_transitions.begin() ); 142 } 143 m_time += dtime; 144 } 145 } 66 146 }; 67 147 … … 77 157 m_pose_binding.prepare( pose_frame, bones ); 78 158 } 79 const bone_transforms & get_bone_transforms() const { return m_bone_transforms; }159 const bone_transforms< transform >& get_bone_transforms() const { return m_bone_transforms; } 80 160 const skeleton_binding& get_pose_binding() const 81 161 { … … 86 166 protected: 87 167 skeleton_binding m_pose_binding; 88 bone_transforms 168 bone_transforms< transform > m_bone_transforms; 89 169 data_node_list m_bone_list; 90 170 }; … … 95 175 public: 96 176 animator_instance() {} 97 void initialize( resource< animator_data > data, resource< animator_bind_data > bind_data ) 98 { 99 m_data = data; 100 m_bind_data = bind_data; 101 } 102 bool is_valid() const { return m_data.is_valid() && m_bind_data.is_valid(); } 103 bool has_clip( shash64 id ) const 104 { 105 if ( auto data = m_data.lock() ) 106 return data->has_clip( id ); 177 void initialize( const animator_data* data ) 178 { 179 m_layers.clear(); 180 m_layers.resize( data->layers.size() ); 181 for ( uint32 i = 0; i < data->layers.size(); ++i ) 182 { 183 m_layers[i].set_state( data->layers[i].def_state ); 184 } 185 } 186 187 const skeleton_transforms& get_transforms() const 188 { 189 return m_transforms; 190 } 191 192 uint32 base_state() const 193 { 194 // HACK 195 if ( m_layers.size() > 1 && m_layers[0].m_transitions.size() < 1 ) return m_layers[0].get_state(); 196 return 0; 197 } 198 199 void queue_event( const animator_data* data, shash64 name ) 200 { 201 for ( uint32 i = 0; i < m_layers.size(); ++i ) 202 // what about activating nonactive layers? 203 if ( m_layers[i].m_current_state != -1 ) 204 { 205 uint32 last_state = m_layers[i].get_final_state(); 206 const animator_state_data& state = data->layers[i].states[last_state]; 207 auto it = state.transitions.find( name ); 208 if ( it != state.transitions.end() ) 209 { 210 m_layers[i].add_transition( it->second, last_state ); 211 } 212 } 213 } 214 215 void update( const animator_data* data, float dtime ) 216 { 217 for ( uint32 i = 0; i < m_layers.size(); ++i ) 218 m_layers[i].update( dtime ); 219 220 for ( uint32 i = 0; i < m_layers.size(); ++ i ) 221 if ( m_layers[i].m_current_state != -1 ) 222 { 223 if ( m_layers[i].m_transitions.size() > 0 ) 224 { 225 animate_layer( data->layers[i], m_layers[i].m_transitions.front(), data->poses, m_layers[i].m_time ); 226 } 227 else 228 { 229 const animator_layer_data& layer = data->layers[i]; 230 const animator_state_data& state = layer.states[m_layers[i].m_current_state]; 231 if ( state.poses.size() > 0 ) 232 animate_state( m_transforms, state, data->layers[i], data->poses, get_frame( state, m_layers[i].m_time ) ); 233 } 234 } 235 236 m_transforms.delocalize( data->poses->get_tree() ); 237 } 238 239 void reset() 240 { 241 for ( uint32 i = 0; i < m_layers.size(); ++i ) 242 m_layers[i].reset(); 243 } 244 245 void update_state_only( const animator_data* data, float dtime, uint32 layer_id, uint32 state_id ) 246 { 247 const animator_layer_data& layer = data->layers[layer_id]; 248 const animator_state_data& state = layer.states[state_id]; 249 m_layers[layer_id].update( dtime ); 250 if ( state.poses.size() > 0 ) 251 animate_state( m_transforms, state, layer, data->poses, get_frame( state, m_layers[layer_id].m_time ) ); 252 m_transforms.delocalize( data->poses->get_tree() ); 253 } 254 255 void update_layer_only( const animator_data* data, float dtime, uint32 layer_id ) 256 { 257 const animator_layer_data& ldata = data->layers[layer_id]; 258 const animator_layer_instance& linst = m_layers[layer_id]; 259 m_layers[layer_id].update( dtime ); 260 if ( m_layers[layer_id].m_transitions.size() > 0 ) 261 { 262 animate_layer( ldata, linst.m_transitions.front(), data->poses, linst.m_time ); 263 } 107 264 else 108 return false; 109 } 110 mat4 get_transform( uint32 idx ) const 111 { 112 if ( idx < m_skeleton.size() ) return m_skeleton.transforms()[idx]; 113 return mat4(); 114 } 115 const skeleton_instance& get_skeleton() const 116 { 117 return m_skeleton; 118 } 119 120 sint16 get_bone_index( shash64 bone_name ) const 121 { 122 if ( is_valid() ) 123 { 124 auto data = m_bind_data.lock(); 125 sint16 id = data->get_bone_list().resolve( bone_name ); 126 return id; 127 } 128 return -1; 129 } 130 131 const mat4& get_bone_matrix( shash64 bone_name ) const 132 { 133 if ( is_valid() ) 134 { 135 auto data = m_bind_data.lock(); 136 sint16 id = data->get_bone_list().resolve( bone_name ); 137 if ( id >= 0 ) 138 { 139 return data->get_bone_list()[id].transform; 140 } 141 } 142 return mat4(); 143 } 144 145 146 void update( shash64 clip, uint32 time ) 147 { 148 if ( is_valid() ) 149 { 150 auto data = m_data.lock(); 151 auto bind_data = m_bind_data.lock(); 152 const animator_clip_data* clip_data = data->get_clip( clip ); 153 154 if ( data->get_pose_data() ) 155 { 156 if ( clip_data ) 157 { 158 auto pose_data = data->get_pose_data(); 159 float fframe = clip_data->range.frame_from_ms_fps( time, 30 ); 160 161 unsigned v1 = unsigned( fframe ); 162 unsigned v2 = v1 + 1; 163 if ( v2 >= clip_data->range.end ) v2 = clip_data->range.start; 164 165 unsigned iv1 = v1 + clip_data->id; 166 unsigned iv2 = v2 + clip_data->id; 167 168 m_transforms.interpolate_slerp( pose_data->get( iv1 ), pose_data->get( iv2 ), fframe - v1 ); 169 m_transforms.delocalize( pose_data->get_tree() ); 170 171 } 172 m_skeleton.assign( m_transforms, bind_data->get_pose_binding(), bind_data->get_bone_transforms() ); 173 } 174 } 175 } 265 { 266 const animator_state_data& state = ldata.states[linst.m_current_state]; 267 if ( state.poses.size() > 0 ) 268 animate_state( m_transforms, state, ldata, data->poses, get_frame( state, linst.m_time ) ); 269 } 270 m_transforms.delocalize( data->poses->get_tree() ); 271 } 272 176 273 protected: 177 resource< animator_data > m_data; 178 resource< animator_bind_data > m_bind_data; 179 skeleton_transforms m_transforms; 180 skeleton_instance m_skeleton; 274 275 void animate_layer( const animator_layer_data& layer, const animator_transition_instance& transition, pose_data_set* pose_data, float t ) 276 { 277 const animator_state_data& base_state = layer.states[transition.source]; 278 if ( base_state.poses.size() > 0 ) 279 animate_state( m_transforms, base_state, layer, pose_data, get_frame( base_state, t ) ); 280 281 float trblend = 0.0f; 282 if ( transition.duration > 0.0f ) 283 { 284 trblend = math::clamp( transition.time / transition.duration, 0.0f, 1.0f ); 285 trblend = easing_eval( trblend, transition.easing ); 286 } 287 288 const animator_state_data& state = layer.states[transition.target]; 289 if ( state.poses.size() > 0 ) 290 animate_state( m_transforms, state, layer, pose_data, get_frame( state, t ), true, trblend, transition.interp ); 291 } 292 293 static float get_frame( const animator_state_data& state, float layer_time ) 294 { 295 uint32 fcount = state.poses.size(); 296 float fframe = 0.0f; 297 if ( state.duration > nv::math::epsilon<float>() ) 298 { 299 float fps = fcount / state.duration; 300 float ctime = state.loop ? fmodf( layer_time, state.duration ) : min( layer_time, state.duration - 0.0001f ); 301 fframe = ctime * fps; 302 } 303 return fframe; 304 } 305 306 static void animate_state( skeleton_transforms& transforms, const animator_state_data& state, const animator_layer_data& layer, const pose_data_set* pose_data, float fframe, bool do_blend = false, float blend = 0.0f, nv::interpolation binterp = interpolation::NONE ) 307 { 308 unsigned v1 = unsigned( fframe ); 309 unsigned v2 = v1 + 1; 310 if ( v2 >= state.poses.size() ) v2 = state.loop ? 0 : state.poses.size() - 1; 311 312 unsigned iv1 = state.poses[v1].pose; 313 unsigned iv2 = state.poses[v2].pose; 314 315 316 if ( iv1 == iv2 ) 317 { 318 if ( do_blend ) 319 transforms.interpolate( transforms, pose_data->get( iv1 ), blend, binterp, layer.mask_vector ); 320 else 321 transforms.assign( pose_data->get( iv1 ), layer.mask_vector ); 322 } 323 else 324 { 325 if ( state.interp == interpolation::QUADRATIC || state.interp == interpolation::SQUADRATIC ) 326 { 327 unsigned s1 = v1 == 0 ? state.poses.size() - 1 : v1 - 1; 328 unsigned s2 = v2 + 1; 329 if ( s2 >= state.poses.size() ) s2 = state.loop ? 0 : state.poses.size() - 1; 330 unsigned is1 = state.poses[s1].pose; 331 unsigned is2 = state.poses[s2].pose; 332 if ( do_blend ) 333 transforms.blend( pose_data->get( is1 ), pose_data->get( iv1 ), pose_data->get( iv2 ), pose_data->get( is2 ), fframe - v1, state.interp, blend, binterp, layer.mask_vector ); 334 else 335 transforms.interpolate( pose_data->get( is1 ), pose_data->get( iv1 ), pose_data->get( iv2 ), pose_data->get( is2 ), fframe - v1, state.interp, layer.mask_vector ); 336 } 337 else 338 { 339 if ( do_blend ) 340 transforms.blend( pose_data->get( iv1 ), pose_data->get( iv2 ), fframe - v1, state.interp, blend, binterp, layer.mask_vector ); 341 else 342 transforms.interpolate( pose_data->get( iv1 ), pose_data->get( iv2 ), fframe - v1, state.interp, layer.mask_vector ); 343 } 344 } 345 } 346 347 vector< animator_layer_instance > m_layers; 348 skeleton_transforms m_transforms; 349 350 351 }; 352 353 class animator_manager : public nv::lua_resource_manager< animator_data > 354 { 355 public: 356 explicit animator_manager( nv::string_table* strings = nullptr ) : m_strings( strings ) {} 357 virtual nv::string_view get_storage_name() const { return "animators"; } 358 virtual nv::string_view get_resource_name() const { return "animator"; } 359 360 nv::resource< animator_data > load_animator( const nv::string_view& id, nv::pose_data_set* poses = nullptr ); 361 nv::resource< animator_data > create_animator( const nv::string_view& id, nv::pose_data_set* poses = nullptr ); 362 protected: 363 virtual bool load_resource( nv::lua::table_guard& table, nv::shash64 id ); 364 nv::resource< animator_data > load_animator( nv::lua::table_guard& table, nv::shash64 id, nv::pose_data_set* poses = nullptr ); 365 366 nv::easing read_easing( nv::lua::table_guard& table ); 367 void fill_mask_vector_rec( nv::vector< bool >& mask_vector, const nv::data_node_tree& tree, nv::uint32 id ) 368 { 369 mask_vector[id] = true; 370 for ( auto child : tree.children( id ) ) 371 fill_mask_vector_rec( mask_vector, tree, child ); 372 } 373 374 nv::string_table* m_strings; 181 375 }; 182 376 -
trunk/nv/engine/material_manager.hh
r484 r486 51 51 { 52 52 public: 53 gpu_material_manager( context* context, material_manager* matmgr, image_manager* imgmgr ) 54 : m_context( context ) 55 , m_material_manager( matmgr ) 56 , m_image_manager( imgmgr ) 57 {} 53 gpu_material_manager( context* context, material_manager* matmgr, image_manager* imgmgr ); 58 54 protected: 59 55 virtual bool load_resource( const string_view& id ); 60 56 virtual void release( gpu_material* m ); 61 57 private: 58 texture m_default; 62 59 context* m_context; 63 60 material_manager* m_material_manager; -
trunk/nv/engine/resource_system.hh
r484 r486 55 55 virtual string_view get_resource_name() const = 0; 56 56 virtual void clear() = 0; 57 void load_all( );57 void load_all( bool do_clear = true ); 58 58 virtual bool load_resource( const string_view& id ); 59 59 virtual ~lua_resource_manager_base() {} -
trunk/nv/formats/assimp_loader.hh
r485 r486 34 34 private: 35 35 bool is_node_animated(); 36 void build_skeleton( vector< data_node_info >& skeleton, const void* node, intparent_id );36 void build_skeleton( vector< data_node_info >& skeleton, const void* node, sint16 parent_id ); 37 37 data_node_list* release_merged_bones(); 38 38 void load_mesh_data( data_channel_set* data, size_t index, data_node_info& info ); -
trunk/nv/gfx/skeleton_instance.hh
r485 r486 48 48 return clamp_frame( ( ms * 0.001f ) * float( fps ) ); 49 49 } 50 51 inline float frame_from_ms_fps( uint32 ms, float fps ) const 52 { 53 return clamp_frame( ( ms * 0.001f ) * fps ); 54 } 50 55 }; 51 56 57 template < typename Transform > 52 58 class bone_transforms 53 59 { 54 60 public: 61 typedef Transform value_type; 62 55 63 bone_transforms() {} 56 void prepare( const data_node_list& bone_data ); 64 void prepare( const data_node_list& bone_data ) 65 { 66 m_offsets.resize( bone_data.size() ); 67 for ( uint16 bi = 0; bi < bone_data.size(); ++bi ) 68 m_offsets[bi] = value_type( bone_data[bi].transform ); 69 } 70 57 71 uint32 size() const { return m_offsets.size(); }; 58 72 protected: 59 dynamic_array< mat4> m_offsets;73 dynamic_array< value_type > m_offsets; 60 74 75 template < typename T > 61 76 friend class skeleton_instance; 62 77 }; … … 76 91 uint32 m_bone_count; 77 92 93 template < typename T > 78 94 friend class skeleton_instance; 79 95 friend class skeleton_transforms; … … 90 106 void assign( const data_node_list* node_data ); 91 107 void assign( const skeleton_transforms& other ); 108 void assign( const skeleton_transforms& other, const array_view< bool >& mask ); 92 109 93 void interpolate_linear( const skeleton_transforms& a, const skeleton_transforms& b, float t ); 94 void interpolate_nlerp( const skeleton_transforms& a, const skeleton_transforms& b, float t ); 95 void interpolate_slerp( const skeleton_transforms& a, const skeleton_transforms& b, float t ); 96 void interpolate4( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t ); 97 void interpolate_squad( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t ); 98 99 // void animate( const mesh_nodes_data* node_data, float frame, bool local = false ) 100 // { 101 // if ( local ) 102 // { 103 // animate_local( node_data, frame ); 104 // return; 105 // } 106 // if ( m_transforms.size() != node_data->size() ) 107 // m_transforms.resize( node_data->size() ); 108 // for ( uint32 n = 0; n < node_data->size(); ++n ) 109 // if ( node_data->get_info( n ).parent_id == -1 ) 110 // animate_rec( node_data, frame, n, transform(), false ); 111 // } 112 void blend_slerp( const skeleton_transforms& a, const skeleton_transforms& b, float t, float blend ); 113 114 // void blend( const mesh_nodes_data* node_data, float frame, float blend, bool local = false ) 115 // { 116 // NV_ASSERT( m_transforms.size() == node_data->size(), "skeleton size wrong!" ); 117 // if ( local ) 118 // { 119 // blend_local( node_data, frame, blend ); 120 // return; 121 // } 122 // for ( uint32 n = 0; n < node_data->size(); ++n ) 123 // if ( node_data->get_info( n ).parent_id == -1 ) 124 // blend_rec( node_data, frame, n, transform(), false, blend ); 125 // } 110 void interpolate( const skeleton_transforms& a, const skeleton_transforms& b, float t, interpolation i ); 111 void interpolate( const skeleton_transforms& a, const skeleton_transforms& b, float t, interpolation i, const array_view< bool >& mask ); 112 void interpolate( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t, interpolation i ); 113 void interpolate( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t, interpolation i, const array_view< bool >& mask ); 114 void blend( const skeleton_transforms& a, const skeleton_transforms& b, float t, interpolation i, float blend, interpolation bi ); 115 void blend( const skeleton_transforms& a, const skeleton_transforms& b, float t, interpolation i, float blend, interpolation bi, const array_view< bool >& mask ); 116 void blend( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t, interpolation i, float blend, interpolation bi ); 117 void blend( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t, interpolation i, float blend, interpolation bi, const array_view< bool >& mask ); 126 118 127 119 void delocalize( const data_node_tree& node_data ) … … 134 126 void delocalize_rec( const data_node_tree& node_data, uint32 id, const transform& parent ); 135 127 136 // void animate_rec( const mesh_nodes_data* node_data, float frame, uint32 id, const transform& parent, bool local );137 // void blend_rec( const mesh_nodes_data* node_data, float frame, uint32 id, const transform& parent, bool local, float blend );138 // void animate_local( const mesh_nodes_data* node_data, float frame );139 // void blend_local( const mesh_nodes_data* node_data, float frame, float blend );140 141 128 // protected: 142 129 dynamic_array< transform > m_transforms; 143 130 }; 144 131 132 template < typename Transform > 145 133 class skeleton_instance 146 134 { 147 135 public: 136 typedef Transform value_type; 137 148 138 skeleton_instance() {} 149 const mat4* transforms() const { return m_matrix.data(); }139 const mat4* xforms() const { return m_matrix.data(); } 150 140 size_t size() const { return m_matrix.size(); } 151 void assign( const skeleton_transforms& skeleton, const skeleton_binding& binding, const bone_transforms& bones ); 152 void assign( const skeleton_transforms& skeleton, const bone_transforms& binding ); 153 void assign( const bone_transforms& binding ); 141 void assign( const skeleton_transforms& skeleton, const skeleton_binding& binding, const bone_transforms< value_type >& bones ) 142 { 143 if ( bones.size() != m_matrix.size() ) m_matrix.resize( bones.size() ); 144 const transform* transforms = skeleton.xforms(); 145 for ( uint32 n = 0; n < skeleton.size(); ++n ) 146 { 147 sint16 bone_id = binding.m_indices[n]; 148 if ( bone_id >= 0 ) 149 { 150 // int too_complex; 151 // transform tr( bones.m_offsets[bone_id] ); 152 // tr.set_orientation( normalize( tr.get_orientation() ) ); 153 // m_matrix[bone_id] = ( transforms[n] * tr ).extract(); 154 m_matrix[bone_id] = ( transforms[n] * bones.m_offsets[bone_id] ).extract(); 155 } 156 } 157 } 158 void assign( const skeleton_transforms& skeleton, const bone_transforms< value_type >& bones ) 159 { 160 if ( bones.size() != m_matrix.size() ) m_matrix.resize( bones.size() ); 161 const transform* transforms = skeleton.xforms(); 162 for ( uint32 n = 0; n < skeleton.size(); ++n ) 163 { 164 m_matrix[n] = ( transforms[n] * bones.m_offsets[n] ).extract(); 165 } 166 } 167 168 void assign( const bone_transforms< value_type >& bones ) 169 { 170 if ( bones.size() != m_matrix.size() ) m_matrix.resize( bones.size() ); 171 } 154 172 protected: 155 173 -
trunk/nv/image/png_loader.hh
r484 r486 21 21 png_loader(); 22 22 virtual bool get_info( stream&, image_format& format, ivec2& size ); 23 virtual bool test( stream& ); 23 24 virtual image_data* load( stream& ); 24 25 virtual image_data* load( stream&, image_format format ); -
trunk/nv/interface/camera.hh
r472 r486 34 34 { 35 35 m_projection = math::perspective( math::radians( fov ), aspect, near, far ); 36 m_near = near; 37 m_far = far; 36 38 } 37 39 void set_ortho( f32 left, f32 right, f32 bottom, f32 top, f32 near = -1.0f, f32 far = 1.0f ) 38 40 { 39 41 m_projection = math::ortho( left, right, bottom, top, near, far ); 42 m_near = near; 43 m_far = far; 40 44 } 41 45 const mat4& get_projection() const … … 55 59 return m_direction; 56 60 } 61 float get_near() const { return m_near; } 62 float get_far() const { return m_far; } 57 63 private: 58 64 bool m_dirty; … … 61 67 mat4 m_projection; 62 68 mat4 m_view; 69 float m_near; 70 float m_far; 63 71 }; 64 72 -
trunk/nv/interface/device.hh
r485 r486 59 59 TEX_NORMAL = 2, 60 60 TEX_GLOSS = 3, 61 TEX_EMISSIVE = 4, 61 62 TEXTURE_0 = 0, 62 63 TEXTURE_1 = 1, … … 287 288 { 288 289 engine_uniform_factory_map& factory_map = get_uniform_factory(); 290 factory_map[ "nv_f_near"] = new engine_uniform_factory< engine_uniform_f_near >(); 291 factory_map[ "nv_f_far"] = new engine_uniform_factory< engine_uniform_f_far >(); 289 292 factory_map[ "nv_m_view" ] = new engine_uniform_factory< engine_uniform_m_view >(); 290 293 factory_map[ "nv_m_view_inv" ] = new engine_uniform_factory< engine_uniform_m_view_inv >(); … … 316 319 factory_link_map[ "nv_t_normal" ] = new engine_link_uniform_int<2>(); 317 320 factory_link_map[ "nv_t_gloss" ] = new engine_link_uniform_int<3>(); 321 factory_link_map[ "nv_t_emissive"] = new engine_link_uniform_int<4>(); 318 322 } 319 323 void destroy_engine_uniforms() -
trunk/nv/interface/image_data.hh
r472 r486 51 51 public: 52 52 image_data( image_format format, ivec2 size, const uint8 * data ) 53 : m_format( format ), m_size( size ), m_data( nullptr ) { initialize( data ); } 53 : m_format( format ), m_size( size ), m_data( nullptr ) 54 { 55 NV_ASSERT_ALWAYS( data, "Data = nullptr!" ); 56 initialize( data ); 57 } 58 image_data( image_format format, ivec2 size ) 59 : m_format( format ), m_size( size ), m_data( nullptr ) 60 { 61 initialize( nullptr ); 62 } 63 void fill( uint8 value = 0 ) 64 { 65 size_t bsize = static_cast<size_t>( m_size.x * m_size.y ) * get_depth(); 66 raw_fill_n( m_data, bsize, value ); 67 } 54 68 uint8* release_data() { uint8* r = m_data; m_data = nullptr; return r; } 55 69 const uint8 * get_data() const { return m_data; } … … 64 78 size_t bsize = static_cast<size_t>(m_size.x * m_size.y) * get_depth(); 65 79 m_data = new uint8[ bsize ]; 66 raw_copy( data, data + bsize, m_data ); 80 if ( data ) 81 raw_copy( data, data + bsize, m_data ); 67 82 } 68 83 -
trunk/nv/interface/image_loader.hh
r484 r486 25 25 public: 26 26 virtual bool get_info( stream&, image_format& format, ivec2& size ) = 0; 27 virtual bool test( stream& ) = 0; 27 28 virtual image_data* load( stream& ) = 0; 28 29 virtual image_data* load( stream&, image_format format ) = 0; -
trunk/nv/interface/uniform.hh
r472 r486 157 157 typedef nv::unordered_map< string_view, engine_link_uniform_base* > engine_link_uniform_factory_map; 158 158 159 class engine_uniform_f_near : public engine_uniform< float > 160 { 161 public: 162 engine_uniform_f_near( uniform_base* u ) : engine_uniform( u ) {} 163 virtual void set( const context*, const scene_state* s ) { m_uniform->set_value( s->get_camera().get_near() ); } 164 }; 165 166 class engine_uniform_f_far : public engine_uniform< float > 167 { 168 public: 169 engine_uniform_f_far( uniform_base* u ) : engine_uniform( u ) {} 170 virtual void set( const context*, const scene_state* s ) { m_uniform->set_value( s->get_camera().get_far() ); } 171 }; 172 159 173 class engine_uniform_m_view : public engine_uniform< mat4 > 160 174 { -
trunk/nv/lua/lua_state.hh
r445 r486 298 298 bool has_field( string_view element ); 299 299 shash64 get_string_hash_64( string_view element, uint64 defval = 0 ); 300 // remove this one 300 301 shash64 get_string( string_view element, string_table& table, uint64 defval = 0 ); 302 shash64 get_string( string_view element, string_table* table, uint64 defval = 0 ); 301 303 const_string get_string( string_view element, string_view defval = string_view() ); 302 304 string128 get_string128( string_view element, string_view defval = string_view() ); -
trunk/nv/stl/container/hash_table.hh
r432 r486 193 193 m_bucket_count = other.m_bucket_count; 194 194 m_element_count = other.m_element_count; 195 m_max_load_factor = other.m ax_load_factor;195 m_max_load_factor = other.m_max_load_factor; 196 196 } 197 197 return *this; … … 619 619 { 620 620 if ( base_type::rehash_check( 1 ) ) b = base_type::get_bucket_index( h ); 621 return insert_return_type( base_type::insert( b, h, ::nv::move(key), ::nv:: forward< M >( obj ) ), true );621 return insert_return_type( base_type::insert( b, h, ::nv::move(key), ::nv::move< M >( obj ) ), true ); 622 622 } 623 623 return insert_return_type( r, false ); -
trunk/nv/stl/hash_store.hh
r433 r486 104 104 { 105 105 insert_return_type result = base_type::try_insert( k, nv::forward<M>( obj ) ); 106 if ( !result.second ) result.first->second = obj;106 if ( !result.second ) result.first->second = nv::move(obj); 107 107 return result; 108 108 } -
trunk/nv/stl/math/basic.hh
r471 r486 52 52 typename T, 53 53 typename Mix = T, 54 bool MixBool = is_same< value_type_t<Mix>, bool > ,54 bool MixBool = is_same< value_type_t<Mix>, bool >::value, 55 55 bool TIsVector = is_vec<T>::value, 56 56 bool MixIsVector = is_vec<Mix>::value > … … 274 274 } 275 275 276 template < typename T, typename enable_if< is_arithmetic<T>::value >::type* = nullptr > 277 constexpr T lerp( T a, T b, T m ) 278 { 279 return a + m * ( b - a ); 280 } 281 282 template < typename T, typename enable_if< is_vec<T>::value >::type* = nullptr > 283 constexpr T lerp( const T& a, const T& b, value_type_t<T> m ) 284 { 285 return a + m * ( b - a ); 286 } 287 276 288 template < typename T, typename enable_if< !is_vec<T>::value >::type* = nullptr > 277 289 constexpr T step( T edge, T x ) -
trunk/nv/stl/math/mat2.hh
r471 r486 287 287 288 288 template <typename T> 289 inline typename tmat2<T>::column_type operator* 290 ( 291 const tmat2<T> & m, 292 typename const tmat2<T>::row_type & v 293 ) 289 inline typename tmat2<T>::column_type operator* ( const tmat2<T> & m, const typename tmat2<T>::row_type & v ) 294 290 { 295 291 return tvec2<T>( … … 299 295 300 296 template <typename T> 301 inline typename tmat2<T>::row_type operator* 302 ( 303 typename const tmat2<T>::column_type & v, 304 const tmat2<T> & m 305 ) 297 inline typename tmat2<T>::row_type operator* ( const typename tmat2<T>::column_type & v, const tmat2<T> & m ) 306 298 { 307 299 return tvec2<T>( … … 337 329 338 330 template <typename T> 339 inline typename tmat2<T>::column_type operator/( const tmat2<T> & m, typename consttmat2<T>::row_type & v )331 inline typename tmat2<T>::column_type operator/( const tmat2<T> & m, const typename tmat2<T>::row_type & v ) 340 332 { 341 333 return detail::compute_inverse<T>( m ) * v; … … 343 335 344 336 template <typename T> 345 inline typename tmat2<T>::row_type operator/( typename consttmat2<T>::column_type & v, const tmat2<T> & m )337 inline typename tmat2<T>::row_type operator/( const typename tmat2<T>::column_type & v, const tmat2<T> & m ) 346 338 { 347 339 return v * detail::compute_inverse<T>( m ); -
trunk/nv/stl/math/mat3.hh
r471 r486 320 320 321 321 template <typename T> 322 inline typename tmat3<T>::column_type operator*( const tmat3<T> & m, typename consttmat3<T>::row_type & v )322 inline typename tmat3<T>::column_type operator*( const tmat3<T> & m, const typename tmat3<T>::row_type & v ) 323 323 { 324 324 return typename tmat3<T>::column_type( … … 329 329 330 330 template <typename T> 331 inline typename tmat3<T>::row_type operator*( typename consttmat3<T>::column_type & v, const tmat3<T> & m )331 inline typename tmat3<T>::row_type operator*( const typename tmat3<T>::column_type & v, const tmat3<T> & m ) 332 332 { 333 333 return typename tmat3<T>::row_type( … … 372 372 373 373 template <typename T> 374 inline typename tmat3<T>::column_type operator/( const tmat3<T> & m, typename consttmat3<T>::row_type & v )374 inline typename tmat3<T>::column_type operator/( const tmat3<T> & m, const typename tmat3<T>::row_type & v ) 375 375 { 376 376 return detail::compute_inverse<T>( m ) * v; … … 378 378 379 379 template <typename T> 380 inline typename tmat3<T>::row_type operator/( typename consttmat3<T>::column_type & v, const tmat3<T> & m )380 inline typename tmat3<T>::row_type operator/( const typename tmat3<T>::column_type & v, const tmat3<T> & m ) 381 381 { 382 382 return v * detail::compute_inverse<T>( m ); -
trunk/nv/stl/math/vec2.hh
r471 r486 98 98 {} 99 99 100 inline tvec2<T> & tvec2<T>::operator+=( T scalar )100 inline tvec2<T> & operator+=( T scalar ) 101 101 { 102 102 this->x += static_cast<T>( scalar ); -
trunk/src/engine/material_manager.cc
r485 r486 12 12 using namespace nv; 13 13 14 15 nv::gpu_material_manager::gpu_material_manager( context* context, material_manager* matmgr, image_manager* imgmgr ) 16 : m_context( context ) 17 , m_material_manager( matmgr ) 18 , m_image_manager( imgmgr ) 19 { 20 uint8 data[2 * 2 * 3]; 21 nv::raw_fill_n( data, 2 * 2 * 3, 0 ); 22 m_default = m_context->get_device()->create_texture( ivec2(2,2), nv::image_format( nv::RGB ), nv::sampler(), data ); 23 } 24 14 25 bool gpu_material_manager::load_resource( const string_view& id ) 15 26 { … … 20 31 for ( uint32 i = 0; i < size( mat->paths ); ++i ) 21 32 if ( !mat->paths[i].empty() ) 33 { 22 34 if ( auto data = m_image_manager->get( mat->paths[i] ).lock() ) 23 35 { 24 36 result->textures[i] = m_context->get_device()->create_texture( &*data, smp ); 25 37 } 38 } 39 40 // HACK 41 for ( uint32 i = 0; i < 5; ++i ) 42 if ( result->textures[i].is_nil() ) 43 result->textures[i] = m_default; 44 26 45 add( id, result ); 27 46 return true; … … 44 63 m->paths[ TEX_SPECULAR ] = table.get_string128( "specular" ); 45 64 m->paths[ TEX_NORMAL ] = table.get_string128( "normal" ); 65 m->paths[ TEX_EMISSIVE ] = table.get_string128( "emissive" ); 46 66 m->paths[ TEX_GLOSS ] = table.get_string128( "gloss" ); 47 67 add( id, m ); -
trunk/src/engine/resource_system.cc
r485 r486 23 23 } 24 24 25 void nv::lua_resource_manager_base::load_all( )25 void nv::lua_resource_manager_base::load_all( bool do_clear ) 26 26 { 27 clear();27 if ( do_clear ) clear(); 28 28 lua::table_guard table( m_lua, get_storage_name() ); 29 29 uint32 count = table.get_unsigned( "__counter" ); -
trunk/src/formats/assimp_loader.cc
r485 r486 133 133 { 134 134 data_node_info info; 135 data_channel_set* data = data_channel_set_creator::create_set( 2 );136 load_mesh_data( data, i, info );137 m_meshes.push_back( data );135 data_channel_set* mdata = data_channel_set_creator::create_set( 2 ); 136 load_mesh_data( mdata, i, info ); 137 m_meshes.push_back( mdata ); 138 138 m_mesh_info.push_back( info ); 139 139 } … … 184 184 int hack_for_node_anim; 185 185 if ( is_node_animated() ) 186 info.parent_id = index;186 info.parent_id = sint16( index ); 187 187 188 188 … … 339 339 } 340 340 341 void nv::assimp_loader::build_skeleton( vector< data_node_info >& skeleton, const void* node, intparent_id )341 void nv::assimp_loader::build_skeleton( vector< data_node_info >& skeleton, const void* node, sint16 parent_id ) 342 342 { 343 343 const aiNode* ainode = reinterpret_cast<const aiNode*>( node ); … … 360 360 info.parent_id = parent_id; 361 361 362 int this_id = skeleton.size();362 sint16 this_id = sint16( skeleton.size() ); 363 363 skeleton.push_back( info ); 364 364 for ( unsigned i = 0; i < ainode->mNumChildren; ++i ) … … 428 428 { 429 429 mat4 tr = nv::math::inverse( assimp_mat4_cast( m_data->node_by_name[bone_data[i].name]->mTransformation ) ); 430 bone_data[i].transform = tr * bone_data[bone_data[i].parent_id].transform; 430 int pid = bone_data[i].parent_id; 431 if ( pid != -1 ) 432 bone_data[i].transform = tr * bone_data[pid].transform; 433 else 434 bone_data[i].transform = tr; 431 435 } 432 436 // list->append( bone_data[i] ); … … 449 453 if ( scene->mRootNode == nullptr || scene->mAnimations == nullptr || scene->mAnimations[index] == nullptr) return nullptr; 450 454 451 const aiNode* root = scene->mRootNode;452 455 const aiAnimation* anim = scene->mAnimations[index]; 453 456 … … 481 484 } 482 485 483 data_node_list* nv::assimp_loader::release_data_node_list( size_t index/*= 0 */ )486 data_node_list* nv::assimp_loader::release_data_node_list( size_t /*= 0 */ ) 484 487 { 485 488 return release_merged_bones(); -
trunk/src/formats/nmd_loader.cc
r485 r486 261 261 nmd_element_header pheader; 262 262 pheader.type = nv::nmd_type::POSES; 263 pheader.children = poses.size();263 pheader.children = uint16( poses.size() ); 264 264 pheader.size = sizeof( transform ) * poses.size() * ( poses.size() > 0 ? poses[0]->size() : 0 ) 265 265 + sizeof( uint32 ) * poses.size(); -
trunk/src/gfx/skeleton_instance.cc
r485 r486 8 8 9 9 #include "nv/core/profiler.hh" 10 #include "nv/interface/interpolate.hh" 10 11 11 12 void nv::skeleton_binding::assign( const skeleton_binding& other ) … … 78 79 } 79 80 80 81 void nv::skeleton_instance::assign( const skeleton_transforms& skeleton, const skeleton_binding& binding, const bone_transforms& bones )82 {83 if ( bones.size() != m_matrix.size() )84 m_matrix.resize( bones.size() );85 const transform* transforms = skeleton.xforms();86 for ( uint32 n = 0; n < skeleton.size(); ++n )87 {88 sint16 bone_id = binding.m_indices[n];89 if ( bone_id >= 0 )90 {91 int too_complex;92 transform tr( bones.m_offsets[bone_id] );93 tr.set_orientation( normalize( tr.get_orientation() ) );94 m_matrix[bone_id] = ( transforms[n] * tr ).extract();95 }96 }97 }98 99 100 void nv::skeleton_instance::assign( const skeleton_transforms& skeleton, const bone_transforms& bones )101 {102 if ( bones.size() != m_matrix.size() )103 m_matrix.resize( bones.size() );104 const transform* transforms = skeleton.xforms();105 for ( uint32 n = 0; n < skeleton.size(); ++n )106 {107 transform tr( bones.m_offsets[n] );108 tr.set_orientation( normalize( tr.get_orientation() ) );109 m_matrix[n] = ( transforms[n] * tr ).extract();110 // m_matrix[n] = transforms[n].extract() * bones.m_offsets[n];111 }112 }113 114 void nv::skeleton_instance::assign( const bone_transforms& bones )115 {116 if ( bones.size() != m_matrix.size() )117 m_matrix.resize( bones.size() );118 }119 120 81 void nv::skeleton_transforms::assign( const data_node_list* node_data ) 121 82 { … … 125 86 for ( uint32 n = 0; n < node_data->size(); ++n ) 126 87 { 127 const data_node_info& info = (*node_data)[ n ]; 128 m_transforms[n] = transform( info.transform ); 88 m_transforms[n] = transform( ( *node_data )[n].transform ); 129 89 } 130 90 } 131 91 132 void nv::skeleton_transforms::interpolate_linear( const skeleton_transforms& a, const skeleton_transforms& b, float t ) 92 void nv::skeleton_transforms::assign( const skeleton_transforms& other, const array_view< bool >& mask ) 93 { 94 if ( m_transforms.size() != other.size() ) m_transforms.resize( other.size() ); 95 if ( mask.size() == 0 ) 96 m_transforms.assign( other.m_transforms ); 97 else 98 for ( uint32 i = 0; i < other.size(); ++i ) 99 if ( mask[i] ) 100 m_transforms[i] = other.m_transforms[i]; 101 } 102 103 void nv::skeleton_transforms::interpolate( const skeleton_transforms& a, const skeleton_transforms& b, float t, interpolation i ) 104 { 105 if ( m_transforms.size() != a.size() ) m_transforms.resize( a.size() ); 106 ::nv::interpolate( m_transforms, t, i, a.m_transforms, b.m_transforms ); 107 } 108 109 void nv::skeleton_transforms::interpolate( const skeleton_transforms& a, const skeleton_transforms& b, float t, interpolation i, const array_view< bool >& mask ) 110 { 111 if ( m_transforms.size() != a.size() ) m_transforms.resize( a.size() ); 112 if ( mask.size() > 0 ) 113 ::nv::interpolate( m_transforms, t, i, mask, a.m_transforms, b.m_transforms ); 114 else 115 ::nv::interpolate( m_transforms, t, i, a.m_transforms, b.m_transforms ); 116 } 117 118 void nv::skeleton_transforms::interpolate( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t, interpolation i ) 119 { 120 if ( m_transforms.size() != s1.size() ) m_transforms.resize( s1.size() ); 121 ::nv::interpolate( m_transforms, t, i, s1.m_transforms, v1.m_transforms, v2.m_transforms, s2.m_transforms ); 122 } 123 124 void nv::skeleton_transforms::interpolate( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t, interpolation i, const array_view< bool >& mask ) 125 { 126 if ( m_transforms.size() != s1.size() ) m_transforms.resize( s1.size() ); 127 if ( mask.size() > 0 ) 128 ::nv::interpolate( m_transforms, t, i, mask, s1.m_transforms, v1.m_transforms, v2.m_transforms, s2.m_transforms ); 129 else 130 ::nv::interpolate( m_transforms, t, i, s1.m_transforms, v1.m_transforms, v2.m_transforms, s2.m_transforms ); 131 } 132 133 void nv::skeleton_transforms::blend( const skeleton_transforms& a, const skeleton_transforms& b, float t, interpolation i, float blend, interpolation bi ) 133 134 { 134 135 NV_ASSERT( a.size() == b.size(), "!!!" ); 135 136 if ( m_transforms.size() != a.size() ) 136 137 m_transforms.resize( a.size() ); 137 for ( uint32 n = 0; n < a.size(); ++n ) 138 { 139 m_transforms[n] = transform( 140 math::mix( a.m_transforms[n].get_position(), b.m_transforms[n].get_position(), t ), 141 math::lerp( a.m_transforms[n].get_orientation(), b.m_transforms[n].get_orientation(), t ) 142 ); 143 } 144 145 // if ( m_transforms.size() > 0 ) 146 // m_transforms[0] = nv::interpolate( a.m_transforms[0], b.m_transforms[0], t, interpolation::SPHERICAL ); 138 ::nv::interpolate( m_transforms, t, i, blend, bi, a.m_transforms, b.m_transforms ); 147 139 } 148 140 149 void nv::skeleton_transforms:: interpolate_nlerp( const skeleton_transforms& a, const skeleton_transforms& b, float t)141 void nv::skeleton_transforms::blend( const skeleton_transforms& a, const skeleton_transforms& b, float t, interpolation i, float blend, interpolation bi, const array_view< bool >& mask ) 150 142 { 151 143 NV_ASSERT( a.size() == b.size(), "!!!" ); 152 144 if ( m_transforms.size() != a.size() ) 153 145 m_transforms.resize( a.size() ); 154 155 for ( uint32 n = 0; n < a.size(); ++n ) 156 { 157 m_transforms[n] = transform( 158 math::mix( a.m_transforms[n].get_position(), b.m_transforms[n].get_position(), t ), 159 math::nlerp( a.m_transforms[n].get_orientation(), b.m_transforms[n].get_orientation(), t ) 160 ); 161 } 146 if ( mask.size() > 0 ) 147 ::nv::interpolate( m_transforms, t, i, blend, bi, mask, a.m_transforms, b.m_transforms ); 148 else 149 ::nv::interpolate( m_transforms, t, i, blend, bi, a.m_transforms, b.m_transforms ); 162 150 } 163 151 164 165 void nv::skeleton_transforms::interpolate_slerp( const skeleton_transforms& a, const skeleton_transforms& b, float t ) 152 void nv::skeleton_transforms::blend( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t, interpolation i, float blend, interpolation bi ) 166 153 { 167 NV_ASSERT( a.size() == b.size(), "!!!" ); 168 if ( m_transforms.size() != a.size() ) 169 m_transforms.resize( a.size() ); 170 for ( uint32 n = 0; n < a.size(); ++n ) 171 { 172 m_transforms[n] = nv::interpolate( a.m_transforms[n], b.m_transforms[n], t, interpolation::SPHERICAL ); 173 } 154 if ( m_transforms.size() != s1.size() ) m_transforms.resize( s1.size() ); 155 ::nv::interpolate( m_transforms, t, i, blend, bi, s1.m_transforms, v1.m_transforms, v2.m_transforms, s2.m_transforms ); 174 156 } 175 157 176 void nv::skeleton_transforms::blend _slerp( const skeleton_transforms& a, const skeleton_transforms& b, float t, float blend)158 void nv::skeleton_transforms::blend( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t, interpolation i, float blend, interpolation bi, const array_view< bool >& mask ) 177 159 { 178 NV_ASSERT( a.size() == b.size(), "!!!" ); 179 if ( m_transforms.size() != a.size() ) 180 m_transforms.resize( a.size() ); 181 for ( uint32 n = 0; n < a.size(); ++n ) 182 { 183 transform tr = nv::interpolate( a.m_transforms[n], b.m_transforms[n], t, interpolation::SPHERICAL ); 184 m_transforms[n] = nv::interpolate( m_transforms[n], tr, blend, interpolation::SPHERICAL ); 185 } 186 } 187 188 189 190 void nv::skeleton_transforms::interpolate4( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t ) 191 { 192 NV_ASSERT( s1.size() == s2.size(), "!!!" ); 193 NV_ASSERT( v1.size() == v2.size(), "!!!" ); 194 NV_ASSERT( s1.size() == v1.size(), "!!!" ); 195 if ( m_transforms.size() != s1.size() ) 196 m_transforms.resize( s1.size() ); 197 float interp_squared = t*t; 198 float interp_cubed = interp_squared*t; 199 float weights[4]; 200 weights[0] = 0.5f * ( -interp_cubed + 2.0f * interp_squared - t ); 201 weights[1] = 0.5f * ( 3.0f * interp_cubed - 5.0f * interp_squared + 2.0f ); 202 weights[2] = 0.5f * ( -3.0f * interp_cubed + 4.0f * interp_squared + t ); 203 weights[3] = 0.5f * ( interp_cubed - interp_squared ); 204 205 for ( uint32 n = 0; n < s1.size(); ++n ) 206 { 207 quat qs1 = s1.m_transforms[n].get_orientation(); 208 quat qs2 = s2.m_transforms[n].get_orientation(); 209 quat qv1 = v1.m_transforms[n].get_orientation(); 210 quat qv2 = v2.m_transforms[n].get_orientation(); 211 212 float a = dot( qv1, qv2 ) > 0.0f ? 1.0f : -1.0f; 213 214 quat qr = weights[0] * qs1 215 + weights[1] * (a * qv1 ) 216 + weights[2] * qv2 217 + weights[3] * qs2; 218 219 qr = normalize( qr ); 220 221 m_transforms[n] = transform( 222 weights[0] * s1.m_transforms[n].get_position() + 223 weights[1] * v1.m_transforms[n].get_position() + 224 weights[2] * v2.m_transforms[n].get_position() + 225 weights[3] * s2.m_transforms[n].get_position(), 226 qr 227 ); 228 } 229 } 230 231 232 void nv::skeleton_transforms::interpolate_squad( const skeleton_transforms& s1, const skeleton_transforms& v1, const skeleton_transforms& v2, const skeleton_transforms& s2, float t ) 233 { 234 NV_ASSERT( s1.size() == s2.size(), "!!!" ); 235 NV_ASSERT( v1.size() == v2.size(), "!!!" ); 236 NV_ASSERT( s1.size() == v1.size(), "!!!" ); 237 if ( m_transforms.size() != s1.size() ) 238 m_transforms.resize( s1.size() ); 239 240 for ( uint32 n = 0; n < s1.size(); ++n ) 241 { 242 nv::quat ss1 = s1.m_transforms[n].get_orientation(); 243 nv::quat ss2 = s2.m_transforms[n].get_orientation(); 244 nv::quat sv1 = v1.m_transforms[n].get_orientation(); 245 nv::quat sv2 = v2.m_transforms[n].get_orientation(); 246 247 nv::quat q = normalize( nv::math::squad( 248 sv1, sv2, 249 nv::math::intermediate( ss1, sv1, sv2 ), 250 nv::math::intermediate( sv1, sv2, ss2 ), 251 t ) ); 252 253 m_transforms[n] = transform( 254 mix( v1.m_transforms[n].get_position(), v2.m_transforms[n].get_position(), t ), 255 q 256 ); 257 } 258 160 if ( m_transforms.size() != s1.size() ) m_transforms.resize( s1.size() ); 161 if ( mask.size() > 0 ) 162 ::nv::interpolate( m_transforms, t, i, blend, bi, mask, s1.m_transforms, v1.m_transforms, v2.m_transforms, s2.m_transforms ); 163 else 164 ::nv::interpolate( m_transforms, t, i, blend, bi, s1.m_transforms, v1.m_transforms, v2.m_transforms, s2.m_transforms ); 259 165 } 260 166 … … 264 170 } 265 171 266 // void nv::skeleton_transforms::blend_local( const mesh_nodes_data* node_data, float frame, float blend )267 // {268 // if ( m_transforms.size() != node_data->size() )269 // m_transforms.resize( node_data->size() );270 // for ( uint32 n = 0; n < node_data->size(); ++n )271 // {272 // const data_channel_set* node = ( *node_data )[n];273 // int inefficient_store_key;274 //275 // transform tr = node->size() > 0 ? raw_channel_interpolator( node ).get< transform >( frame ) : transform( /*node->get_transform()*/ ); int confirm_that_not_needed;276 // m_transforms[n] = nv::interpolate( m_transforms[n], tr, blend, interpolation::SPHERICAL );277 // }278 // }279 //280 // void nv::skeleton_transforms::animate_local( const mesh_nodes_data* node_data, float frame )281 // {282 // if ( m_transforms.size() != node_data->size() )283 // m_transforms.resize( node_data->size() );284 // for ( uint32 n = 0; n < node_data->size(); ++n )285 // {286 // const data_channel_set* node = ( *node_data )[n];287 // if ( node->size() > 0 )288 // {289 // int inefficient_store_key;290 // m_transforms[n] = raw_channel_interpolator( node ).get< transform >( frame );291 // }292 // }293 // }294 172 295 173 void nv::skeleton_transforms::delocalize_rec( const data_node_tree& node_data, uint32 id, const transform& parent ) … … 304 182 } 305 183 306 // void nv::skeleton_transforms::blend_rec( const mesh_nodes_data* node_data, float frame, uint32 id, const transform& parent, bool local, float blend )307 // {308 // const data_channel_set* node = ( *node_data )[id];309 // int confirm_that_not_needed;310 // transform node_mat/*( node->get_transform() )*/;311 //312 // if ( node->size() > 0 )313 // {314 // int inefficient_store_key;315 //316 // raw_channel_interpolator interpolator( node );317 // node_mat = interpolator.get< transform >( frame );318 // }319 // transform global_mat = parent * node_mat;320 // m_transforms[id] = nv::interpolate( m_transforms[id], local ? node_mat : global_mat, blend, interpolation::SPHERICAL );321 // for ( auto child : node_data->children( id ) )322 // {323 // blend_rec( node_data, frame, child, global_mat, local, blend );324 // }325 //326 // }327 //328 // void nv::skeleton_transforms::animate_rec( const mesh_nodes_data* node_data, float frame, uint32 id, const transform& parent, bool local )329 // {330 // const data_channel_set* node = ( *node_data )[id];331 // transform node_mat;332 // int inefficient_store_key;333 //334 // if ( node->size() > 0 )335 // node_mat = raw_channel_interpolator( node ).get< transform >( frame );336 // int confirm_that_not_needed;337 // // else338 // // node_mat = transform( node->get_transform() );339 // transform global_mat = parent * node_mat;340 // m_transforms[id] = local ? node_mat : global_mat;341 // for ( auto child : node_data->children( id ) )342 // {343 // animate_rec( node_data, frame, child, global_mat, local );344 // }345 //346 // }347 348 void nv::bone_transforms::prepare( const data_node_list& bone_data )349 {350 m_offsets.resize( bone_data.size() );351 352 for ( nv::uint16 bi = 0; bi < bone_data.size(); ++bi )353 m_offsets[bi] = bone_data[bi].transform;354 } -
trunk/src/image/miniz.cc
r484 r486 813 813 static void *def_alloc_func( void *opaque, size_t items, size_t size ) { (void)opaque, (void)items, (void)size; return MZ_MALLOC( items * size ); } 814 814 static void def_free_func( void *opaque, void *address ) { (void)opaque, (void)address; MZ_FREE( address ); } 815 static void *def_realloc_func( void *opaque, void *address, size_t items, size_t size ) { (void)opaque, (void)address, (void)items, (void)size; return MZ_REALLOC( address, items * size ); }815 // static void *def_realloc_func( void *opaque, void *address, size_t items, size_t size ) { (void)opaque, (void)address, (void)items, (void)size; return MZ_REALLOC( address, items * size ); } 816 816 817 817 const char *mz_version( void ) -
trunk/src/image/png_loader.cc
r484 r486 665 665 } 666 666 667 667 668 static int stbi__unpremultiply_on_load = 0; 668 669 static int stbi__de_iphone_flag = 0; 669 670 671 /* 670 672 static void stbi_set_unpremultiply_on_load( int flag_true_if_should_unpremultiply ) 671 673 { … … 677 679 stbi__de_iphone_flag = flag_true_if_should_convert; 678 680 } 681 */ 679 682 680 683 static void stbi__de_iphone( stbi__png *z ) … … 1021 1024 } 1022 1025 1026 bool nv::png_loader::test( stream& str ) 1027 { 1028 stbi__context s( &stbi__callbacks, (void *)&str ); 1029 return stbi__png_test( &s ) != 0; 1030 } 1031 1023 1032 image_data* nv::png_loader::load( stream& s ) 1024 1033 { -
trunk/src/io/c_stream.cc
r484 r486 98 98 if ( m_file != nullptr ) 99 99 { 100 return ::feof( reinterpret_cast<FILE*>( m_file ) ) ;100 return ::feof( reinterpret_cast<FILE*>( m_file ) ) != 0; 101 101 } 102 return true; 102 103 } -
trunk/src/lua/lua_state.cc
r440 r486 194 194 str = lua_tolstring( m_state, -1, &l ); 195 195 result = hash_string< uint64 >( str, l ); 196 //NV_LOG_DEBUG( str ); 196 197 } 197 198 lua_pop( m_state, 1 ); … … 204 205 size_t l = 0; 205 206 const char* str = nullptr; 206 uint64 result = defval;207 shash64 result = shash64( defval ); 207 208 if ( lua_type( m_state, -1 ) == LUA_TSTRING ) 208 209 { 209 210 str = lua_tolstring( m_state, -1, &l ); 210 result = table.insert( string_view( str, l ) ).value(); 211 } 212 lua_pop( m_state, 1 ); 213 return shash64( result ); 211 result = table.insert( string_view( str, l ) ); 212 } 213 lua_pop( m_state, 1 ); 214 return result; 215 } 216 217 nv::shash64 nv::lua::table_guard::get_string( string_view element, string_table* table, uint64 defval /*= 0 */ ) 218 { 219 lua_getfield( m_state, -1, element.data() ); 220 size_t l = 0; 221 const char* str = nullptr; 222 shash64 result = shash64( defval ); 223 if ( lua_type( m_state, -1 ) == LUA_TSTRING ) 224 { 225 str = lua_tolstring( m_state, -1, &l ); 226 string_view sv( str, l ); 227 result = table ? table->insert( sv ) : shash64( sv ); 228 } 229 lua_pop( m_state, 1 ); 230 return result; 214 231 } 215 232 -
trunk/src/sdl/sdl_window.cc
r440 r486 45 45 } 46 46 47 // NV_LOG( LOG_INFO, "Joystick count : " << SDL_NumJoysticks() ); 48 // SDL_Joystick* j = SDL_JoystickOpen(0); 49 // if (j) 50 // { 51 // NV_LOG( LOG_INFO, "Joystick Name: " << SDL_JoystickNameForIndex(0) ); 52 // NV_LOG( LOG_INFO, "Joystick Number of Axes: " << SDL_JoystickNumAxes(j)); 53 // NV_LOG( LOG_INFO, "Joystick Number of Buttons: " << SDL_JoystickNumButtons(j)); 54 // NV_LOG( LOG_INFO, "Joystick Number of Balls: " << SDL_JoystickNumBalls(j)); 55 // } 47 // NV_LOG_INFO( "Joystick count : ", SDL_NumJoysticks() ); 48 // SDL_Joystick* j = SDL_JoystickOpen(0); 49 // if ( j ) 50 // { 51 // NV_LOG_INFO( "Joystick Name: ", SDL_JoystickNameForIndex( 0 ) ); 52 // NV_LOG_INFO( "Joystick Number of Axes: ", SDL_JoystickNumAxes( j ) ); 53 // NV_LOG_INFO( "Joystick Number of Buttons: ", SDL_JoystickNumButtons( j ) ); 54 // NV_LOG_INFO( "Joystick Number of Balls: ", SDL_JoystickNumBalls( j ) ); 55 // } 56 57 NV_LOG_INFO( "Joystick count : ", SDL_NumJoysticks() ); 58 SDL_GameController *controller = NULL; 59 int controller_index = 0; 60 for ( int i = 0; i < SDL_NumJoysticks(); ++i ) 61 { 62 if ( SDL_IsGameController( i ) ) 63 { 64 controller = SDL_GameControllerOpen( i ); 65 controller_index = i; 66 if ( controller ) break; 67 NV_LOG_ERROR( "Could not open gamecontroller ", i, ": ", SDL_GetError() ); 68 } 69 } 70 71 if ( controller ) 72 { 73 SDL_Joystick* j = SDL_GameControllerGetJoystick( controller ); 74 NV_LOG_INFO( "Controller Name: ", SDL_GameControllerNameForIndex( controller_index ) ); 75 NV_LOG_INFO( "Controller Number of Axes: ", SDL_JoystickNumAxes( j ) ); 76 NV_LOG_INFO( "Controller Number of Buttons: ", SDL_JoystickNumButtons( j ) ); 77 NV_LOG_INFO( "Controller Number of Balls: ", SDL_JoystickNumBalls( j ) ); 78 } 79 80 56 81 57 82 void* ctx_handle = SDL_GL_CreateContext( static_cast<SDL_Window*>( m_handle ) );
Note: See TracChangeset
for help on using the changeset viewer.