- Timestamp:
- 07/16/15 21:21:19 (10 years ago)
- Location:
- trunk
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/interface/data_channel.hh
r421 r424 83 83 friend class data_channel_set_creator; 84 84 friend class raw_data_channel_access; 85 friend class mesh_nodes_creator; 85 86 86 87 typedef const raw_data_channel* const_iterator; … … 90 91 for ( uint32 c = 0; c < other.m_size; ++c ) 91 92 m_channels[c] = move( other.m_channels[c] ); 92 m_size = other.m_size; 93 m_size = other.m_size; 94 m_parent_id = other.m_parent_id; 95 m_transform = other.m_transform; 96 m_name = other.m_name; 93 97 other.m_size = 0; 94 98 } … … 100 104 for ( uint32 c = 0; c < other.m_size; ++c ) 101 105 m_channels[c] = move( other.m_channels[c] ); 102 m_size = other.m_size; 106 m_size = other.m_size; 107 m_parent_id = other.m_parent_id; 108 m_transform = other.m_transform; 109 m_name = other.m_name; 103 110 other.m_size = 0; 104 111 } … … 201 208 const_iterator begin() const { return &m_channels[0]; } 202 209 const_iterator end() const { return &m_channels[ m_size ]; } 210 211 uint64 get_name() const { return m_name; } 212 sint16 get_parent_id() const { return m_parent_id; } 213 const mat4& get_transform() const { return m_transform; } 214 203 215 protected: 204 216 205 217 data_channel_set() 206 218 { 207 m_size = 0; 208 } 219 m_size = 0; 220 m_name = 0; 221 m_parent_id = -1; 222 } 223 209 224 raw_data_channel m_channels[4]; 225 210 226 uint32 m_size; 227 uint64 m_name; 228 sint16 m_parent_id; 229 mat4 m_transform; 211 230 }; 212 231 -
trunk/nv/interface/data_channel_access.hh
r419 r424 101 101 public: 102 102 103 static data_channel_set* create ( size_t )103 static data_channel_set* create_set( size_t ) 104 104 { 105 105 return new data_channel_set; 106 106 } 107 107 108 static data_channel_set* create_ array( size_t size, size_t )108 static data_channel_set* create_set_array( size_t size, size_t ) 109 109 { 110 110 return new data_channel_set[ size ]; … … 146 146 void move_to( data_channel_set& other ) 147 147 { 148 int change_to_move; 148 149 // other.m_name = m_name; 149 150 for ( uint32 c = 0; c < m_set->m_size; ++c ) … … 152 153 other.m_channels[c] = move( m_set->m_channels[c] ); 153 154 } 155 other.m_name = m_set->m_name; 156 other.m_parent_id = m_set->m_parent_id; 157 other.m_transform = m_set->m_transform; 154 158 other.m_size = m_set->m_size; 155 159 m_set->m_size = 0; 156 160 } 157 161 162 void set_transform( const mat4& tr ) { m_set->m_transform = tr; } 163 const mat4& get_transform() const { return m_set->m_transform; } 164 165 void set_name( uint64 name ) { m_set->m_name = name; } 166 uint64 get_name() const { return m_set->m_name; } 167 168 void set_parent_id( sint16 name ) { m_set->m_parent_id = name; } 169 sint16 get_parent_id() const { return m_set->m_parent_id; } 158 170 protected: 159 171 data_channel_set* m_set; -
trunk/nv/interface/mesh_data.hh
r423 r424 22 22 using mesh_data = data_channel_set; 23 23 24 #pragma warning TODO_LIST! 25 // TODO : 26 // * get rid of mesh_node_data, optimize further 27 // * properly write and read strings from nmd's 28 // * mesh_loader string_table support 29 // * properly write strings in other loaders 30 // * attribute/property implementation and read/write on every nmd::command 24 31 struct mesh_node_data 25 32 { 26 uint64 name;27 sint16 parent_id;28 mat4 transform;29 33 data_channel_set* data; 30 34 }; … … 48 52 size_t get_count() const { return m_count; } 49 53 54 bool is_animated( size_t i ) const 55 { 56 if ( i >= m_count ) return false; 57 return ( m_nodes[i].data && m_nodes[i].data->size() > 0 ); 58 } 59 50 60 const mesh_node_data* get_node( size_t i ) const 51 61 { … … 58 68 for ( uint32 i = 0; i < m_count; ++i ) 59 69 { 60 if ( m_nodes[ i ].name == h ) 70 NV_ASSERT( m_nodes[i].data, "data!" ); 71 if ( m_nodes[ i ].data->get_name() == h ) 61 72 return &m_nodes[ i ]; 62 73 } … … 68 79 for ( uint32 i = 0; i < m_count; ++i ) 69 80 { 70 if ( m_nodes[ i ].name == h ) 81 NV_ASSERT( m_nodes[i].data, "data!" ); 82 if ( m_nodes[ i ].data->get_name() == h ) 71 83 return int( i ); 72 84 } -
trunk/src/formats/assimp_loader.cc
r423 r424 108 108 { 109 109 if ( index >= m_mesh_count ) return nullptr; 110 data_channel_set* result = data_channel_set_creator::create ( 2 );110 data_channel_set* result = data_channel_set_creator::create_set( 2 ); 111 111 load_mesh_data( result, index ); 112 112 return result; … … 199 199 aiBone* bone = mesh->mBones[m]; 200 200 mat4 offset = assimp_mat4_cast( bone->mOffsetMatrix ); 201 // bones[m].name = bone->mName.data; 202 bones[m].name = hash_string< uint64 >( bone->mName.data ); 203 bones[m].data = nullptr; 204 bones[m].parent_id = -1; 205 // bones[m].target_id = -1; 206 bones[m].transform = offset; 201 bones[m].data = data_channel_set_creator::create_set( 0 ); 202 data_channel_set_creator access( bones[m].data ); 203 access.set_name( hash_string< uint64 >( bone->mName.data ) ); 204 access.set_transform( offset ); 207 205 } 208 206 return true; … … 302 300 303 301 mesh_node_data& bone = bones[b]; 304 auto iname = names.find( bone. name);302 auto iname = names.find( bone.data->get_name() ); 305 303 if ( iname == names.end() ) 306 304 { … … 308 306 uint16 index = uint16( final_bones.size() ); 309 307 final_bones.push_back( bone ); 310 names[ bone. name] = index;308 names[ bone.data->get_name() ] = index; 311 309 translate[b] = index; 312 310 } … … 390 388 mesh_node_data& a_data = nodes[ this_id ]; 391 389 392 // a_data.name = name; 393 a_data.name = hash_string< uint64 >( name.c_str() ); 394 a_data.parent_id = parent_id; 390 if (anode) 391 create_keys( &a_data, anode ); 392 else 393 a_data.data = data_channel_set_creator::create_set( 0 ); 394 395 data_channel_set_creator access( a_data.data ); 396 access.set_name( hash_string< uint64 >( name.c_str() ) ); 397 access.set_parent_id( parent_id ); 395 398 // This value is ignored by the create_transformed_keys, but needed by create_direct_keys! 396 399 // TODO: find a common solution! 397 400 // This is bad because create_transformed_keys never uses node-transformations for 398 401 // node's without keys 399 a_data.transform = nv::assimp_mat4_cast( node->mTransformation ); 400 if (this_id == 0) 401 a_data.transform = mat4(); 402 a_data.data = nullptr; 403 404 if (anode) create_keys( &a_data, anode ); 402 access.set_transform( nv::assimp_mat4_cast( node->mTransformation ) ); 403 if ( this_id == 0 ) access.set_transform( mat4() ); 405 404 406 405 nv::sint16 next = this_id + 1; … … 421 420 } 422 421 423 data->data = data_channel_set_creator::create ( 2 );422 data->data = data_channel_set_creator::create_set( 2 ); 424 423 data_channel_set_creator key_set( data->data ); 425 424 … … 465 464 const aiScene* scene = reinterpret_cast<const aiScene*>( m_scene ); 466 465 bool has_bones = false; 467 data_channel_set* meshes = data_channel_set_creator::create_ array( m_mesh_count, 2 );466 data_channel_set* meshes = data_channel_set_creator::create_set_array( m_mesh_count, 2 ); 468 467 for ( size_t m = 0; m < m_mesh_count; ++m ) 469 468 { -
trunk/src/formats/md2_loader.cc
r417 r424 313 313 data_channel_set* nv::md2_loader::release_mesh_data( size_t ) 314 314 { 315 data_channel_set* data = data_channel_set_creator::create ( 3 );315 data_channel_set* data = data_channel_set_creator::create_set( 3 ); 316 316 release_mesh_frame( data, -1 ); 317 317 return data; … … 367 367 mesh_data_pack* nv::md2_loader::release_mesh_data_pack() 368 368 { 369 data_channel_set* data = data_channel_set_creator::create_ array( 1, 3 );369 data_channel_set* data = data_channel_set_creator::create_set_array( 1, 3 ); 370 370 release_mesh_frame( &data[0], -1 ); 371 371 return new mesh_data_pack( 1, data ); -
trunk/src/formats/md3_loader.cc
r423 r424 324 324 data_channel_set* nv::md3_loader::release_mesh_data( nv::size_t index ) 325 325 { 326 data_channel_set* data = data_channel_set_creator::create (3);326 data_channel_set* data = data_channel_set_creator::create_set(3); 327 327 release_mesh_frame( data, -1, static_cast< sint32 >( index ) ); 328 328 return data; … … 424 424 const md3_tag_t& rtag = md3->tags[i]; 425 425 string_view name( reinterpret_cast< const char* >(rtag.name) ); 426 427 nodes[i].transform = mat4(); 428 nodes[i].name = hash_string< uint64 >( name.data() ); 429 nodes[i].parent_id = -1; 430 nodes[i].data = data_channel_set_creator::create( 1 ); 431 load_tags( data_channel_set_creator( nodes[i].data ).add_channel<md3_key>( uint32( md3->header.num_frames ) ).channel(), name ); 426 nodes[i].data = data_channel_set_creator::create_set( 1 ); 427 data_channel_set_creator access( nodes[i].data ); 428 access.set_name( hash_string< uint64 >( name.data() ) ); 429 load_tags( access.add_channel<md3_key>( uint32( md3->header.num_frames ) ).channel(), name ); 432 430 } 433 431 int name_; … … 442 440 if ( m_merge_all ) 443 441 { 444 data = data_channel_set_creator::create_ array(1,3);442 data = data_channel_set_creator::create_set_array(1,3); 445 443 release_mesh_frame( &data[0], -1, -1 ); 446 444 data_channel_set_creator( &data[0] ).set_name( reinterpret_cast< char* >( md3->header.name ) ); … … 449 447 { 450 448 count = md3->header.num_surfaces; 451 data = data_channel_set_creator::create_ array( count, 3 );449 data = data_channel_set_creator::create_set_array( count, 3 ); 452 450 for ( int i = 0; i < count; ++i ) 453 451 { -
trunk/src/formats/md5_loader.cc
r423 r424 118 118 { 119 119 std::string name; 120 sstream >> name >> nodes[i].parent_id; 120 sint16 parent_id; 121 sstream >> name >> parent_id; 121 122 vec3 pos; 122 123 quat orient; … … 128 129 unit_quat_w( orient ); 129 130 remove_quotes( name ); 130 // nodes[i].name = name; 131 nodes[i].name = hash_string< uint64 >( name.c_str() ); 132 // nodes[i].target_id = -1; 133 nodes[i].parent_id = -1; 134 nodes[i].transform = transform( pos, orient ).inverse().extract(); 135 nodes[i].data = nullptr; 131 nodes[i].data = data_channel_set_creator::create_set( 0 ); 132 data_channel_set_creator access( nodes[i].data ); 133 access.set_parent_id( parent_id ); 134 access.set_transform( transform( pos, orient ).inverse().extract() ); 135 access.set_name( hash_string< uint64 >( name.c_str() ) ); 136 136 next_line( sstream ); 137 137 } … … 141 141 { 142 142 assert( m_type == MESH ); 143 data_channel_set* mesh = data_channel_set_creator::create ( 4 );143 data_channel_set* mesh = data_channel_set_creator::create_set( 4 ); 144 144 data_channel_set_creator maccess( mesh ); 145 145 … … 251 251 { 252 252 std::string name; 253 sstream >> name >> nodes[i].parent_id >> joint_infos[i].flags >> joint_infos[i].start_index; 253 sint16 parent_id; 254 sstream >> name >> parent_id >> joint_infos[i].flags >> joint_infos[i].start_index; 254 255 remove_quotes( name ); 255 // nodes[i].name = name;256 nodes[i].name = hash_string< uint64 >( name.c_str());257 nodes[i].transform = mat4();258 nodes[i].data = data_channel_set_creator::create( 1);259 data_channel_set_creator( nodes[i].data ).add_channel< md5_key_t >( num_frames);256 nodes[i].data = data_channel_set_creator::create_set( 1 ); 257 data_channel_set_creator access( nodes[i].data ); 258 access.add_channel< md5_key_t >( num_frames ); 259 access.set_name( hash_string< uint64 >( name.c_str() ) ); 260 access.set_parent_id( parent_id ); 260 261 next_line( sstream ); 261 262 } … … 391 392 md5_weight& weight = weights[start_weight + j]; 392 393 const mesh_node_data& joint = nodes[weight.joint_id]; 393 const transform tr = transform( joint. transform).inverse();394 const transform tr = transform( joint.data->get_transform() ).inverse(); 394 395 vec3 rot_pos = tr.get_orientation() * weight.pos; 395 396 … … 454 455 { 455 456 const mesh_node_data& joint = nodes[vdata.boneindex[j]]; 456 const transform tr = transform( joint. transform).inverse();457 const transform tr = transform( joint.data->get_transform() ).inverse(); 457 458 vdata.normal += ( normal * tr.get_orientation() ) * vdata.boneweight[j]; 458 459 vdata.tangent += ( tangent * tr.get_orientation() ) * vdata.boneweight[j]; … … 472 473 const md5_joint_info& jinfo = joint_infos[i]; 473 474 mesh_node_data& joint = nodes[i]; 474 int parent_id = joint. parent_id;475 int parent_id = joint.data->get_parent_id(); 475 476 476 477 vec3 pos = base_frames[i].get_position(); … … 519 520 { 520 521 uint32 size = m_meshes.size(); 521 data_channel_set* meshes = data_channel_set_creator::create_ array( size, 4 );522 data_channel_set* meshes = data_channel_set_creator::create_set_array( size, 4 ); 522 523 for ( uint32 i = 0; i < size; ++i ) 523 524 { -
trunk/src/formats/nmd_loader.cc
r423 r424 37 37 bool nv::nmd_loader::load_mesh( stream& source, const nmd_element_header& e ) 38 38 { 39 data_channel_set* mesh = data_channel_set_creator::create ( e.children );39 data_channel_set* mesh = data_channel_set_creator::create_set( e.children ); 40 40 load_channel_set( source, mesh, e ); 41 41 // m_mesh_names.push_back( e.name ); … … 55 55 { 56 56 uint32 size = m_meshes.size(); 57 data_channel_set* meshes = data_channel_set_creator::create_ array( size, 0 );57 data_channel_set* meshes = data_channel_set_creator::create_set_array( size, 0 ); 58 58 for ( uint32 i = 0; i < size; ++i ) 59 59 { … … 119 119 bool nv::nmd_loader::load_node( stream& source, mesh_node_data* data, const nmd_element_header& e ) 120 120 { 121 data->name = e.name; 122 data->parent_id = e.parent_id; 123 data->transform = e.transform; 124 data->data = nullptr; 121 data->data = data_channel_set_creator::create_set( e.children ); 125 122 if ( e.children > 0 ) 126 123 { 127 data->data = data_channel_set_creator::create( e.children );128 124 load_channel_set( source, data->data, e ); 129 125 } 126 data_channel_set_creator access( data->data ); 127 access.set_name( e.name ); 128 access.set_parent_id( e.parent_id ); 129 access.set_transform( e.transform ); 130 130 return true; 131 131 } … … 206 206 eheader.children = static_cast<uint16>( chan_count ); 207 207 eheader.size = chan_size; 208 eheader.name = node-> name;209 eheader.parent_id = node-> parent_id;210 eheader.transform = node-> transform;208 eheader.name = node->data->get_name(); 209 eheader.parent_id = node->data->get_parent_id(); 210 eheader.transform = node->data->get_transform(); 211 211 eheader.attributes = 0; 212 212 stream_out.write( &eheader, sizeof( eheader ), 1 ); 213 if ( node->data) nmd_dump_channel_set( node->data, stream_out );213 if ( chan_count > 0 ) nmd_dump_channel_set( node->data, stream_out ); 214 214 } 215 215 … … 238 238 eheader.children = static_cast<uint16>( mesh.size() ); 239 239 eheader.size = size; 240 int uncomment; 241 // eheader.name = mesh.get_name(); 242 // eheader.transform = mesh.get_transform(); 243 // eheader.parent_id = mesh.get_parent_id(); 244 eheader.name = 0; 245 eheader.transform = mat4(); 246 eheader.parent_id = -1; 240 eheader.name = mesh.get_name(); 241 eheader.transform = mesh.get_transform(); 242 eheader.parent_id = mesh.get_parent_id(); 247 243 eheader.attributes = 0; 248 244 stream_out.write( &eheader, sizeof( eheader ), 1 ); -
trunk/src/formats/obj_loader.cc
r417 r424 326 326 } 327 327 328 data_channel_set* result = data_channel_set_creator::create ( 1 );328 data_channel_set* result = data_channel_set_creator::create_set( 1 ); 329 329 data_channel_set_creator raccess( result );// ( reader->name ); 330 330 uint8* rdata = raccess.add_channel( m_descriptor, reader->size * 3 ).raw_data(); … … 359 359 { 360 360 uint32 size = m_meshes.size(); 361 data_channel_set* meshes = data_channel_set_creator::create_ array( size, 1 );361 data_channel_set* meshes = data_channel_set_creator::create_set_array( size, 1 ); 362 362 for ( uint32 i = 0; i < size; ++i ) 363 363 { -
trunk/src/gfx/keyframed_mesh.cc
r419 r424 56 56 NV_ASSERT( node_id < m_tag_map->get_count(), "TAGMAP FAIL" ); 57 57 const data_channel_set* data = m_tag_map->get_node( node_id )->data; 58 NV_ASSERT( data , "TAG FAIL" );58 NV_ASSERT( data && data->size() > 0, "TAG FAIL" ); 59 59 raw_channel_interpolator interpolator( data, m_interpolation_key ); 60 60 return interpolator.get< transform >( m_last_frame, m_next_frame, m_interpolation ); -
trunk/src/gfx/mesh_creator.cc
r419 r424 18 18 for ( size_t i = 0; i < m_data->get_count(); ++i ) 19 19 { 20 sint16 parent_id = m_data->m_nodes[i]. parent_id;20 sint16 parent_id = m_data->m_nodes[i].data->get_parent_id(); 21 21 data_channel_set* keys = m_data->m_nodes[i].data; 22 22 data_channel_set* pkeys = ( parent_id != -1 ? m_data->m_nodes[parent_id].data : nullptr ); … … 65 65 } 66 66 67 data_channel_set* new_keys = data_channel_set_creator::create ( 1 );67 data_channel_set* new_keys = data_channel_set_creator::create_set( 1 ); 68 68 data_channel_set_creator nk_access( new_keys ); 69 nk_access.set_name( old_keys->get_name() ); 70 nk_access.set_parent_id( old_keys->get_parent_id() ); 71 nk_access.set_transform( old_keys->get_transform() ); 69 72 data_channel_access< nv_key_transform > kt_channel( nk_access.add_channel<nv_key_transform>( max_keys ) ); 70 73 … … 100 103 { 101 104 mesh_node_data& node = m_data->m_nodes[i]; 102 node. transform = pre_transform * node.transform * post_transform;105 node.data->m_transform = pre_transform * node.data->m_transform * post_transform; 103 106 if ( node.data ) 104 107 { -
trunk/src/gfx/skeletal_mesh.cc
r423 r424 23 23 for ( uint32 i = 0; i < bones->get_count(); ++i ) 24 24 { 25 m_bone_offset[i] = transform( bones->get_node(i)-> transform);25 m_bone_offset[i] = transform( bones->get_node(i)->data->get_transform() ); 26 26 } 27 27 … … 95 95 for ( size_t i = 0; i < m_node_data->get_count(); ++i ) 96 96 { 97 if ( m_node_data-> get_node( i )->data)97 if ( m_node_data->is_animated( i ) ) 98 98 { 99 99 m_interpolation_key = m_node_data->get_node( i )->data->get_interpolation_key(); … … 133 133 { 134 134 const mesh_node_data* node = m_node_data->get_node(n); 135 if ( node-> parent_id!= -1 )136 { 137 m_children[ node-> parent_id].push_back( n );135 if ( node->data->get_parent_id() != -1 ) 136 { 137 m_children[ node->data->get_parent_id()].push_back( n ); 138 138 } 139 139 } … … 157 157 { 158 158 const mesh_node_data* node = m_node_data->get_node(n); 159 nv::mat4 node_mat( node-> transform);160 161 if ( node->data )159 nv::mat4 node_mat( node->data->get_transform() ); 160 161 if ( node->data && node->data->size() > 0 ) 162 162 { 163 163 raw_channel_interpolator interpolator( node->data, m_interpolation_key ); … … 178 178 { 179 179 const mesh_node_data* bone = bones->get_node(bi); 180 bone_names[ bone-> name] = bi;181 m_offsets[bi] = bone-> transform;180 bone_names[ bone->data->get_name() ] = bi; 181 m_offsets[bi] = bone->data->get_transform(); 182 182 } 183 183 … … 187 187 sint16 bone_id = -1; 188 188 189 auto bi = bone_names.find( node-> name);189 auto bi = bone_names.find( node->data->get_name() ); 190 190 if ( bi != bone_names.end() ) 191 191 { … … 194 194 m_bone_ids[n] = bone_id; 195 195 196 if ( m_interpolation_key.size() == 0 && node->data )196 if ( m_interpolation_key.size() == 0 && node->data->size() > 0 ) 197 197 m_interpolation_key = node->data->get_interpolation_key(); 198 198 … … 206 206 // see note in assimp_loader.cc:load_node 207 207 const mesh_node_data* node = m_node_data->get_node( node_id ); 208 mat4 node_mat( node-> transform);209 210 if ( node->data )208 mat4 node_mat( node->data->get_transform() ); 209 210 if ( node->data && node->data->size() > 0 ) 211 211 { 212 212 raw_channel_interpolator interpolator( node->data, m_interpolation_key );
Note: See TracChangeset
for help on using the changeset viewer.