Ooops
October 19, 2021, 09:53:22

Author Topic: [bb] Load/Save Anim .b3d by Ricky Smith [ 1+ years ago ]  (Read 957 times)

Offline BlitzBot

  • Jr. Member
  • **
  • Posts: 1
Title : Load/Save Anim .b3d
Author : Ricky Smith
Posted : 1+ years ago

Description : This is the function from the first version of PaceMaker to load and save animated .b3d files.
It uses type structures to store the info. This was based on the b3d2Xml code by Peter Scheutz.


Code :
Code: BlitzBasic
  1. ;--------------------------------------------------------------
  2. ;
  3. ; B3d importer
  4. ; Adapted for PaceMaker by Ricky Smith
  5. ; Based on code by M Sibley & Peter Sheultz
  6. ;
  7. ;
  8. ;--------------------------------------------------------------
  9.  
  10. Include "b3dfile.bb"    ; get this file from www.blitzbasic.com ->
  11.                                 ; Community  -> Specs And utils -> Sample Blitz code
  12.                                
  13. ;OSB:   in b3dfile.bb change "Function b3dReadFloat()" to "Function b3dReadFloat#()"                   
  14.                                
  15. Global mesh
  16. Dim PMK_tex_id%(255,255)
  17. Const PMK_ERROR_NONE=True
  18. Const PMK_ERROR_NOFILE=-1
  19. Const PMK_ERROR_FILENOTVALID =-2
  20. Const PMK_ERROR_WRONGVERSION =-3
  21.  
  22.  
  23. Const PMK_FLAG_StripTexturePaths=1
  24. Const PMK_FLAG_StripBrushPaths=2
  25. Const PMK_FLAG_StripNodePaths=4
  26. Const PMK_FLAG_SkipVertices=8
  27. Const PMK_FLAG_SkipTriangles=16
  28. Const PMK_FLAG_SkipKeys=32
  29. Const PMK_FLAG_SkipWeights=64
  30.  
  31.  
  32. Const PMK_MAX_KEYS = 5000
  33. Const PMK_MAX_VRTS = 50000
  34. Const PMK_MAX_TRIS = 20000
  35. Const PMK_MAX_TEXS = 255
  36. Const PMK_MAX_BRUS = 255
  37.  
  38. Global PMK_emf
  39. Global PMK_xml$
  40. Global PMK_xmlpos
  41. Global PMK_xmlpos2
  42. Global PMK_xmlpos3
  43. Global PMK_kflags
  44. Global PMK_brushtexcount
  45. Global PMK_vflags
  46. Global PMK_vtexsets
  47. Global PMK_vtexsize
  48. ;Global cname$
  49. .types
  50. Type  NodeChunk
  51.         Field name$
  52.         Field x_pos#                           
  53.         Field y_pos#
  54.         Field z_pos#
  55.         Field x_scl#
  56.         Field y_scl#
  57.         Field z_scl#
  58.         Field w_rot#
  59.         Field x_rot#
  60.         Field y_rot#
  61.         Field z_rot#
  62.         Field gui_id%
  63.         Field joint
  64.         Field geo
  65.         ;Field bone.ray
  66.         Field prename$
  67.         Field class$
  68.         Field xrot#
  69.         Field yrot#
  70.         Field zrot#
  71.         Field norm=0
  72.         ;Field bp.bodypoint
  73.         Field newborn=0
  74.         Field Parent
  75.         ;Field rb.ODEGeom
  76.         ;Field loangle#=-Pi*0.25;-45 degrees
  77.         ;Field hiangle#=Pi*0.25;-45 degrees
  78.         ;Field Axis1=1
  79.         ;Field Axis2=2
  80.         ;Field joint_type% = 2
  81.         ;Field max_force#=0.0
  82.         ;Field vel#=0.0
  83.         ;Field angulardamp#=0.5
  84.         ;Field lineardamp#=0.5
  85.         ;Field fixed=False
  86.         ;Field nproxy
  87.         Field anim_flags%,Num_Frames%,FramesPS#
  88.  
  89.  
  90.  
  91.         Field mesh_brush_id
  92.        
  93.  
  94. ; VrtsChunk
  95.         Field vrts_count%,vrts_flags%,texturecoordsets%,texturecoordsize%
  96.         ;fieldrS#[PMK_MAX_VRTS],gS#[PMK_MAX_VRTS],bS#[PMK_MAX_VRTS]
  97.         Field vrts_index%[PMK_MAX_VRTS],x#[PMK_MAX_VRTS],y#[PMK_MAX_VRTS],z#[PMK_MAX_VRTS]
  98.         Field u0#[PMK_MAX_VRTS],v0#[PMK_MAX_VRTS],w0#[PMK_MAX_VRTS];UVW coords
  99.         Field u1#[PMK_MAX_VRTS],v1#[PMK_MAX_VRTS],w1#[PMK_MAX_VRTS];2nd UVW coords
  100.         Field nx#[PMK_MAX_VRTS],ny#[PMK_MAX_VRTS],nz#[PMK_MAX_VRTS]
  101.         Field r#[PMK_MAX_VRTS],g#[PMK_MAX_VRTS],b#[PMK_MAX_VRTS],a#[PMK_MAX_VRTS]
  102.         Field vrts_ent%[PMK_MAX_VRTS],joint1%[PMK_MAX_VRTS],joint2%[PMK_MAX_VRTS],joint3%[PMK_MAX_VRTS],joint4%[PMK_MAX_VRTS]
  103.         Field weight1#[PMK_MAX_VRTS],weight2#[PMK_MAX_VRTS],weight3#[PMK_MAX_VRTS],weight4#[PMK_MAX_VRTS]
  104.         Field Frontfacing[PMK_MAX_VRTS]
  105. ;End
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112. ; BoneChunk
  113.         Field weight_count%,vert_target%[PMK_MAX_VRTS],weight#[PMK_MAX_VRTS]
  114. ;End
  115.  
  116.  
  117.  
  118. ; KeysChunk
  119.         Field keys_flag%,keys_count%,moved=0
  120.         Field frame%[PMK_MAX_KEYS],frameP%[PMK_MAX_KEYS],frameS%[PMK_MAX_KEYS],frameR%[PMK_MAX_KEYS]
  121.         Field key_px#[PMK_MAX_KEYS],key_py#[PMK_MAX_KEYS],key_pz#[PMK_MAX_KEYS]
  122.         Field key_sx#[PMK_MAX_KEYS],key_sy#[PMK_MAX_KEYS],key_sz#[PMK_MAX_KEYS]
  123.         Field key_rw#[PMK_MAX_KEYS],key_rx#[PMK_MAX_KEYS],key_ry#[PMK_MAX_KEYS],key_rz#[PMK_MAX_KEYS]
  124.         ;Field key_qrw#[PMK_MAX_KEYS],key_qrx#[PMK_MAX_KEYS],key_qry#[PMK_MAX_KEYS],key_qrz#[PMK_MAX_KEYS]
  125.         ;Field key_brw#[PMK_MAX_KEYS],key_brx#[PMK_MAX_KEYS],key_bry#[PMK_MAX_KEYS],key_brz#[PMK_MAX_KEYS]
  126.         ;Field key_pitch#[PMK_MAX_KEYS],key_yaw#[PMK_MAX_KEYS],key_roll#[PMK_MAX_KEYS]
  127.         ;Field bone_w#,bone_x#,bone_y#,bone_z#
  128.        
  129. End Type
  130.  
  131. Type Texs
  132.                         Field mesh
  133.                         Field name$[PMK_MAX_TEXS]
  134.                         Field flags%[PMK_MAX_TEXS]
  135.                         Field blend%[PMK_MAX_TEXS]
  136.                         Field xpos#[PMK_MAX_TEXS]
  137.                         Field ypos#[PMK_MAX_TEXS]
  138.                         Field xscale#[PMK_MAX_TEXS]
  139.                         Field yscale#[PMK_MAX_TEXS]
  140.                         Field rot#[PMK_MAX_TEXS]
  141.                         Field texs_count%
  142. End Type
  143.  
  144.  
  145. Type Brus
  146.                         Field   name$[PMK_MAX_BRUS]
  147.                         Field   red#[PMK_MAX_BRUS]
  148.                         Field   grn#[PMK_MAX_BRUS]
  149.                         Field   blu#[PMK_MAX_BRUS]
  150.                         Field   alp#[PMK_MAX_BRUS]
  151.                         Field   shi#[PMK_MAX_BRUS]
  152.                         Field   blend%[PMK_MAX_BRUS]
  153.                         Field   fx%[PMK_MAX_BRUS]
  154.                 ;       Field   tex_id%[PMK_MAX_TEXS]
  155.                         Field   brus_count%
  156.                         Field   brus_tex_count%
  157. End Type
  158.  
  159. Type TrisChunk
  160.         Field mesh,tris_count%,tris_brush_id%,tv0%[PMK_MAX_TRIS],tv1%[PMK_MAX_TRIS],tv2%[PMK_MAX_TRIS]
  161. End Type
  162.  
  163.  
  164.  
  165.  
  166. Global b3dbrush.brus
  167. Global b3dtex.texs
  168. Global b3dnode.NodeChunk
  169. Global b3dmesh.NodeChunk
  170. Global b3dtris.trischunk
  171. ;Global b3dseq.sequence
  172. Global Cnode.NodeChunk
  173. Global DoneRefKey=False
  174. Global retval
  175.  
  176.  
  177. ;Dim leaf(100)
  178. Global NodeCount=0
  179. Global NewJointNo=0
  180. ;Dim Joint(100)
  181. Global level
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191. Function b3d2pmk(b3dfile$,dumpflags=0)
  192.         mesh=LoadAnimMesh(b3dfile$)
  193.         Local file
  194.  
  195.  
  196.         file=ReadFile( b3dfile$)
  197.         If Not file Return PMK_ERROR_NOFILE
  198.        
  199.         b3dSetFile( file )
  200.        
  201.         If b3dReadChunk$()<>"BB3D"  Return PMK_ERROR_FILENOTVALID ;RuntimeError "Invalid b3d file"
  202.        
  203.         version=b3dReadInt()
  204.        
  205.         If version/100>0 Return  PMK_ERROR_WRONGVERSION ;RuntimeError "Invalid b3d file version"
  206.        
  207.        
  208.        
  209.        
  210.        
  211.        
  212.        
  213.        
  214.        
  215.         DumpChunks(dumpflags,"*")
  216.        
  217.         b3dExitChunk()
  218.        
  219.        
  220.        
  221.        
  222.         CloseFile file
  223.  
  224.  
  225.         Return PMK_ERROR_NONE
  226.  
  227. End Function
  228.  
  229.  
  230.  
  231. Function DumpChunks(dumpflags, tab$="",level%=0)
  232.         tt$=tab$
  233.         tab$=tab$+"  "
  234.         level%=level%+1
  235.                         While b3dChunkSize()
  236.                 chunk$=b3dReadChunk$()
  237.                
  238. .anim          
  239.                 Select chunk$
  240.                 Case "SEQS"
  241.                        
  242.                 ;       b3dseq.sequence=New sequence
  243.                 ;       b3dseq
  244. ame$=b3dReadString()
  245.                 ;       b3dseqfstart%=b3dReadInt()
  246.                 ;       b3dseqfend%=b3dReadInt()
  247.                 ;       b3dseqseq%=ExtractAnimSeq (mesh,b3dseqfstart%,b3dseqfend%)
  248.                 ;       b3dseqgui_id=AddListBoxItem( lstSeq, 0, b3dseqseq% + " - " + b3dseq
  249. ame$)
  250.                 Case "PHYS"
  251.                 ;       b3dnodejoint_type=b3dReadInt()
  252.                 ;       b3dnodeloangle#=b3dReadFloat()
  253.                 ;       b3dnodehiangle#=b3dReadFloat()
  254.                 ;       b3dnodeAxis1=b3dReadInt()
  255.                 ;       b3dnodeAxis2=b3dReadInt()      
  256.                        
  257.                        
  258.                 Case "ANIM"
  259.        
  260.                         flags=b3dReadInt()
  261.                         n_frames=b3dReadInt()
  262.                         fps=b3dReadFloat()                     
  263.                                                
  264.                         AnimFrames%=n_frames
  265.                 ;       DebugLog "Anim Frames :" + AnimFrames
  266.                         AnimFPS#=fps
  267.                        
  268.                         ;___________________________________
  269.                        
  270.                         b3dnodeanim_flags%=flags
  271.                         b3dnodeNum_Frames%=n_frames
  272.                         b3dnodeFramesPS#=fps
  273.                         ;_____________________________________
  274. .keys
  275.                 Case "KEYS"
  276.                                
  277.                         ;For mark=0 To PMK_MAX_KEYS;b3dmeshNum_Frames%
  278.                         ;                       b3dnodeframe%[mark]=-1
  279.                         ;                       b3dnodeframeP%[mark]=-1
  280.                         ;                       b3dnodeframeS%[mark]=-1
  281.                         ;                       b3dnodeframeR%[mark]=-1
  282.                 ;       Next
  283.                         flags=b3dReadInt()
  284.  
  285.                                                
  286.                        
  287.                        
  288.                         b3dnodekeys_flag%=flags
  289.                        
  290.  
  291.                         sz=4
  292.                         If flags And 1 sz=sz+12
  293.                         If flags And 2 sz=sz+12
  294.                         If flags And 4 sz=sz+16
  295.                         n_keys=b3dChunkSize()/sz
  296.                         b3dnodekeys_count%=n_keys
  297.                                                                        
  298.                                
  299.                        
  300.                         If n_keys*sz=b3dChunkSize()
  301.                        
  302.                                 While b3dChunkSize()
  303.                                         frame=b3dReadInt()
  304.                                                
  305.                                        
  306.                                        
  307.                                         b3dnodeframe%[frame]=frame
  308.                                        
  309.                                        
  310.                                         If flags And 1
  311.                                                 b3dnodeframeP%[frame]=frame
  312.                                                 key_px#=b3dReadFloat()
  313.                                                 key_py#=b3dReadFloat()
  314.                                                 key_pz#=b3dReadFloat()
  315.                                                
  316.                                                        
  317.                                                
  318.                                                 b3dnodekey_px#[frame]=key_px#
  319.                                                 b3dnodekey_py#[frame]=key_py#
  320.                                                 b3dnodekey_pz#[frame]=key_pz#                  
  321.                                                
  322.                                         EndIf
  323.                                        
  324.                                         If flags And 2
  325.                                                 b3dnodeframeS%[frame]=frame
  326.                                                 key_sx#=b3dReadFloat()
  327.                                                 key_sy#=b3dReadFloat()
  328.                                                 key_sz#=b3dReadFloat()
  329.  
  330.                                                
  331.                                                
  332.                                                 b3dnodekey_sx#[frame]=key_sx#
  333.                                                 b3dnodekey_sy#[frame]=key_sy#
  334.                                                 b3dnodekey_sz#[frame]=key_sz#
  335.  
  336.                                         EndIf
  337.                                        
  338.                                         If flags And 4
  339.                                                 b3dnodeframeR%[frame]=frame
  340.                                                 key_rw#=b3dReadFloat()
  341.                                                 key_rx#=b3dReadFloat()
  342.                                                 key_ry#=b3dReadFloat()
  343.                                                 key_rz#=b3dReadFloat()
  344.  
  345.                                        
  346.                                                
  347.                                                 b3dnodekey_rw#[frame]=key_rw#
  348.                                                 b3dnodekey_rx#[frame]=key_rx#
  349.                                                 b3dnodekey_ry#[frame]=key_ry#
  350.                                                 b3dnodekey_rz#[frame]=key_rz#
  351.  
  352.                                         EndIf
  353.                                        
  354.                                                                
  355.                                 ;       If frame  > highframe Then highframe=frame                                             
  356.                                        
  357.                                 Wend
  358.                         Else
  359.                                 ;;;DebugLog tab$+"***** Illegal number of keys *****"
  360.                         EndIf
  361.                 Case "TEXS"
  362.                         b3dtex.texs=New texs
  363.                         index=0
  364.                         While b3dChunkSize()
  365.                                 name$=b3dReadString$()
  366.                                 flags=b3dReadInt()
  367.                                 blend=b3dReadInt()
  368.                                 x_pos#=b3dReadFloat()
  369.                                 y_pos#=b3dReadFloat()
  370.                                 x_scl#=b3dReadFloat()
  371.                                 y_scl#=b3dReadFloat()
  372.                                 rot#=b3dReadFloat()
  373.  
  374.  
  375.  
  376.                                 If dumpflags And PMK_FLAG_StripTexturePaths Then  name$=StripPath(name$)
  377.  
  378.                        
  379.                                
  380.                                
  381.                                
  382.                                 b3dtex
  383. ame$[index]=name$
  384.                                 b3dtexflags%[index]=flags
  385.                                 b3dtexlend%[index]=blend
  386.                                 b3dtexxpos#[index]=x_pos#
  387.                                 b3dtexypos#[index]=y_pos#
  388.                                 b3dtexxscale#[index]=x_scl#
  389.                                 b3dtexyscale#[index]=y_scl#
  390.                                 b3dtex
  391. ot#[index]=rot#
  392.                        
  393.                         index=index+1  
  394.                         Wend
  395.                         b3dtex  exs_count%=index
  396. .brus
  397.                 Case "BRUS"
  398.                         b3dbrush.brus=New brus
  399.                         n_texs=b3dReadInt()
  400.                         b3dbrushrus_tex_count%=n_texs
  401.  
  402.                                                        
  403.                        
  404.                         index=0
  405.                         ;read all brushes in chunk...
  406.                         While b3dChunkSize()
  407.                                 name$=b3dReadString$()
  408.                                 red#=b3dReadFloat()
  409.                                 grn#=b3dReadFloat()
  410.                                 blu#=b3dReadFloat()
  411.                                 alp#=b3dReadFloat()
  412.                                 shi#=b3dReadFloat()
  413.                                 blend=b3dReadInt()
  414.                                 fx=b3dReadInt()
  415.                                
  416.                                
  417.                                
  418.                         b3dbrush
  419. ame$[index]=name$
  420.                         b3dbrush
  421. ed#[index]=red#
  422.                         b3dbrushgrn#[index]=grn#
  423.                         b3dbrushlu#[index]=blu#
  424.                         b3dbrushalp#[index]=alp#
  425.                         b3dbrushshi#[index]=shi#
  426.                         b3dbrushlend%[index]=blend
  427.                         b3dbrushfx%[index]=fx
  428.                
  429.  
  430.  
  431.  
  432.                                
  433.                                 If dumpflags And PMK_FLAG_StripBrushPaths Then  name$=StripPath(name$)
  434.                                
  435.                                
  436.                                
  437.                                        
  438.                                 For k=0 To n_texs-1
  439.                                         tex_id=b3dReadInt()
  440.                                        
  441.                                     PMK_tex_id%(index,k)=tex_id
  442.                                 Next
  443.                                
  444.                                        
  445.                         index=index+1
  446.                         Wend
  447.                         b3dbrushrus_count%=index
  448.  
  449.  
  450.  
  451. .verts                         
  452.                 Case "VRTS"
  453.                         flags=b3dReadInt()
  454.                         tc_sets=b3dReadInt()
  455.                         tc_size=b3dReadInt()
  456.                         sz=12+tc_sets*tc_size*4
  457.                         If flags And 1 Then sz=sz+12
  458.                         If flags And 2 Then sz=sz+16
  459.                         n_verts=b3dChunkSize()/sz
  460.                        
  461.                        
  462.                                
  463.                        
  464.                
  465.  
  466.                        
  467.                        
  468.                         b3dnodevrts_count%=n_verts             
  469.                         b3dnodevrts_flags%=flags
  470.                         b3dnode exturecoordsets%=tc_sets
  471.                         b3dnode exturecoordsize%=tc_size
  472.                        
  473.                        
  474.                        
  475.                        
  476.                
  477.                
  478.                         If n_verts*sz=b3dChunkSize()
  479.                                 index%=0
  480.                                 ;read all verts in chunk
  481.                                 While b3dChunkSize()
  482.                                        
  483.                                        
  484.                                         b3dnodevrts_index%[index]=0; Used for Selection !
  485.                                        
  486.                                                                        
  487.                                         x#=b3dReadFloat()
  488.                                         y#=b3dReadFloat()
  489.                                         z#=b3dReadFloat()
  490.                                        
  491.                                        
  492.                                        
  493.                                         b3dnodex#[index]=x#
  494.                                         b3dnodey#[index]=y#
  495.                                         b3dnodez#[index]=z#
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.                                        
  503.                                        
  504.                                        
  505.                                                                        
  506.                                        
  507.                                        
  508.                                        
  509.                                         If flags And 1
  510.                                                 nx#=b3dReadFloat()
  511.                                                 ny#=b3dReadFloat()
  512.                                                 nz#=b3dReadFloat()
  513.                                                
  514.                                                
  515.                                                
  516.                                                 b3dnode
  517. x#[index]=nx#
  518.                                                 b3dnode
  519. y#[index]=ny#
  520.                                                 b3dnode
  521. z#[index]=nz#
  522.                                        
  523.                                                                                                
  524.                                         EndIf
  525.                                         If flags And 2
  526.                                                 r#=b3dReadFloat()
  527.                                                 g#=b3dReadFloat()
  528.                                                 b#=b3dReadFloat()
  529.                                                 a#=b3dReadFloat()
  530.                                                
  531.                                                
  532.                                                
  533.                                                
  534.                                                 b3dnode
  535. #[index]=r#
  536.                                                 b3dnodeg#[index]=g#
  537.                                                 b3dnode#[index]=b#
  538.                                                 b3dnodea#[index]=a#
  539.  
  540.                                                
  541.                                         EndIf
  542. ;Parent vert boxes                             
  543.                                 ;       b3dnodevrts_ent[index]=CreateCube()
  544.                                 ;       NameEntity b3dnodevrts_ent[index],index
  545.                                 ;       EntityColor b3dnodevrts_ent[index],255,255,255
  546.                                 ;       EntityParent b3dnodevrts_ent[index],b3dnodejoint
  547.                                 ;       PositionEntity b3dnodevrts_ent[index],x,y,z,0
  548.                                 ;       ScaleMesh b3dnodevrts_ent[index],.1,.1,.1
  549.                                 ;       b3dnode
  550. S#[index]=255
  551.                                 ;       b3dnodegS#[index]=255
  552.                                 ;       b3dnodeS#[index]=255
  553.                                 ;       EntityPickMode b3dnodevrts_ent[index],2
  554.                                         coordnameindex=0
  555.                                         set=0
  556.                                         ;read tex coords...
  557.                                         For j=1 To tc_sets*tc_size
  558.                                                 uvw#=b3dReadFloat()
  559.                                                
  560.                                                 coordnameindex=coordnameindex + 1
  561.                                                 If coordnameindex>tc_size Then
  562.                                                         coordnameindex =1
  563.                                                         set=set+1
  564.                                                 EndIf
  565.  
  566.                                                 If coordnameindex=1
  567.                                                         cn$="u"
  568.                                                         If Not set Then
  569.                                                                 b3dnodeu0#[index]=uvw
  570.                                                         Else
  571.                                                                 b3dnodeu1#[index]=uvw
  572.                                                         End If
  573.  
  574.  
  575.                                                 ElseIf coordnameindex=2
  576.                                                         cn$="v"
  577.                                                         If Not set Then
  578.                                                                 b3dnodev0#[index]=uvw
  579.                                                         Else
  580.                                                                 b3dnodev1#[index]=uvw
  581.                                                         End If
  582.  
  583.  
  584.  
  585.                                                 Else
  586.                                                         cn$="w"
  587.                                                         If Not set Then
  588.                                                                 b3dnodew0#[index]=uvw
  589.                                                         Else
  590.                                                                 b3dnodew1#[index]=uvw
  591.                                                         End If
  592.  
  593.  
  594.  
  595.                                                 EndIf
  596.                                                
  597.                                                
  598.                                                
  599.                                         Next
  600.  
  601.                                                
  602.                                                                
  603.                                        
  604.                                         index=index+1
  605.  
  606.                                 Wend
  607.                         Else
  608.                                 ;;;DebugLog tab$+"***** Illegal number of vertices *****"
  609.                         EndIf
  610.                 Case "TRIS"
  611.                         b3dtris.trischunk=New trischunk
  612.                        
  613.                         brush_id=b3dReadInt()
  614.                         sz=12
  615.                         n_tris=b3dChunkSize()/sz
  616.                        
  617.                                
  618.                        
  619.                        
  620.                         b3dtris ris_count%=n_tris
  621.                         b3dtris ris_brush_id%=brush_id 
  622.                        
  623. .tris                  
  624.                         If n_tris*sz=b3dChunkSize()
  625.                         index%=0
  626.                                 ;read all tris in chunk
  627.                                 While b3dChunkSize()
  628.                                         v0=b3dReadInt()
  629.                                         v1=b3dReadInt()
  630.                                         v2=b3dReadInt()
  631.  
  632.                                        
  633.                                         b3dtris v0%[index]=v0
  634.                                         b3dtris v1%[index]=v1
  635.                                         b3dtris v2%[index]=v2
  636.                                         index%=index%+1
  637.                                 Wend
  638.                         Else
  639.                                 ;;;DebugLog tab$+"***** Illegal number of triangles *****"
  640.                         EndIf
  641.                 Case "MESH"
  642.                         brush_id=b3dReadInt()
  643.                        
  644.                        
  645.                        
  646.                         b3dnodemesh_brush_id=brush_id
  647.                         b3dnodeclass$="mesh"
  648.                         b3dmesh=b3dnode
  649.                         ;HideEntity b3dmeshgeo                         
  650. .bone                  
  651.                 Case "BONE"
  652.                        
  653.                  
  654.                         sz=8
  655.                         n_weights=b3dChunkSize()/sz
  656.                         b3dnodeweight_count%=n_weights
  657.                        
  658.                         b3dnodeclass$="bone"
  659.                         index%=0
  660.                         If n_weights*sz=b3dChunkSize()
  661.                                 ;read all weights
  662.                                 While b3dChunkSize()
  663.                                         vertex_id=b3dReadInt()
  664.                                         weight#=b3dReadFloat()
  665.                                        
  666.                         ;               If weight#>b3dnodeweight#[index]
  667.                                         b3dnodevert_target%[vertex_id]=1;vertex_id
  668.                                        
  669.                                         b3dnodeweight#[vertex_id]=weight
  670.                                        
  671.                                 ;       Else
  672.                                        
  673.                                 ;       n_weights=n_weights-1
  674.                                 ;       End If
  675.                                        
  676.                                 ;       For tmp.NodeChunk=Each NodeChunk
  677.                                 ;       EntityParent b3dmeshvrts_ent[vertex_id],b3dnodejoint
  678.                                 ;       DebugLog "Parenting "+ EntityName(b3dnodevrts_ent[vertex_id])+" to "+ b3dnode
  679. ame$
  680.                                 flag=0                                 
  681.                                 If  b3dmeshjoint1[vertex_id]=0 And flag=0 Then
  682.                                                 b3dmeshjoint1[vertex_id]=b3dnodejoint
  683.                                                 b3dmeshweight1#[vertex_id]=weight
  684.                                                 flag=1
  685.                                 End If
  686.                                
  687.                                 If  b3dmeshjoint2[vertex_id]=0 And flag=0 Then
  688.                                                 b3dmeshjoint2[vertex_id]=b3dnodejoint
  689.                                                 b3dmeshweight2#[vertex_id]=weight
  690.                                                 flag=2
  691.                                 End If
  692.                                  
  693.                                 If  b3dmeshjoint3[vertex_id]=0 And flag=0 Then
  694.                                                 b3dmeshjoint3[vertex_id]=b3dnodejoint
  695.                                                 b3dmeshweight3#[vertex_id]=weight
  696.                                                 flag=3
  697.                                 End If
  698.                                
  699.                                 If  b3dmeshjoint4[vertex_id]=0 And flag=0 Then
  700.                                                 b3dmeshjoint4[vertex_id]=b3dnodejoint
  701.                                                 b3dmeshweight4#[vertex_id]=weight
  702.                                                 flag=4
  703.                                 End If
  704.  
  705.  
  706.                                                
  707.                                          
  708.                                
  709.                                
  710.                                
  711.                                        
  712.                                
  713.                                         index%=index%+1
  714.                                 Wend
  715.                         Else
  716.                                 ;;;DebugLog tab$+"***** Illegal number of bone weights *****"
  717.                         EndIf
  718.                        
  719.                        
  720.                        
  721.                        
  722. .nodes
  723.                 Case "NODE"
  724.                
  725.                         ;If level%>1
  726.                         b3dnode.NodeChunk=New NodeChunk
  727.                 ;       End If
  728.                         b3dnodeclass$="root"                    ;
  729.                         name$=b3dReadString$()
  730.                         x_pos#=b3dReadFloat()
  731.                         y_pos#=b3dReadFloat()
  732.                         z_pos#=b3dReadFloat()
  733.                         x_scl#=b3dReadFloat()
  734.                         y_scl#=b3dReadFloat()
  735.                         z_scl#=b3dReadFloat()
  736.                         w_rot#=b3dReadFloat()
  737.                         x_rot#=b3dReadFloat()
  738.                         y_rot#=b3dReadFloat()
  739.                         z_rot#=b3dReadFloat()
  740.         ;               If w_rot#<>1.0 Then b3dnode
  741. orm=1
  742.                        
  743.                         b3dnodejoint=findchildentity(mesh,name$)
  744.                 ;       DebugLog "creating "+name$ +" "+ b3dnodejoint
  745.  
  746.  
  747.                         b3dnode
  748. ame$=name$
  749.                         b3dnodex_pos#=x_pos#
  750.                         b3dnodey_pos#=y_pos#
  751.                         b3dnodez_pos#=z_pos#
  752.                         b3dnodex_scl#=x_scl#
  753.                         b3dnodey_scl#=y_scl#
  754.                         b3dnodez_scl#=z_scl#
  755.                         b3dnodew_rot#=w_rot#
  756.                         b3dnodex_rot#=x_rot#
  757.                         b3dnodey_rot#=y_rot#
  758.                         b3dnodez_rot#=z_rot#
  759.                        
  760.                         For mark=0 To PMK_MAX_KEYS;b3dmeshNum_Frames%
  761.                                                 b3dnodeframe%[mark]=-1
  762.                                                 b3dnodeframeP%[mark]=-1
  763.                                                 b3dnodeframeS%[mark]=-1
  764.                                                 b3dnodeframeR%[mark]=-1
  765.                         Next
  766.                         ;b3dnodeloangle#=-45.0;-45;-Pi*0.25;-45 degrees
  767.                         ;b3dnodehiangle#=45.0;Pi*0.25;-45 degrees
  768.                         ;b3dnodeAxis1=1
  769.                         ;b3dnodeAxis2=2
  770.                         ;b3dnodejoint_type% = 2
  771.                         ;b3dnodemax_force#=0.0
  772.                         ;b3dnodevel#=0.0
  773.                         ;b3dnodeangulardamp#=0.5
  774.                         ;b3dnodelineardamp#=0.5
  775.                         ;b3dnode
  776. proxy=CreatePivot()
  777.                 ;       DebugLog  b3dnode.NodeChunk
  778. ame$
  779.  
  780.         If b3dnodejoint=0 Then
  781.                 ;b3dnodegui_id=AddTreeViewNode( treeJoints, name$ );
  782.         ;       DebugLog "adding node  :"+b3dnode
  783. ame$ +"  parent="+b3dnodejoint+"   mesh="+mesh
  784.  
  785.         Else If GetParent(b3dnodejoint)=mesh Then
  786.                        
  787.                         ;b3dnodegui_id=AddTreeViewNode( treeJoints, name$ )
  788.                         b3dnodeparent=mesh
  789.         Else
  790.                
  791.                 For tmp.Nodechunk=Each NodeChunk
  792.         ;       DebugLog "looking for.."+tmpjoint+"  parent   :"+GetParent (b3dnodejoint)
  793.                         If tmpjoint=GetParent (b3dnodejoint) Then
  794.                                 ;b3dnodegui_id=AddTreeViewNode( tmpgui_id, name$ )
  795.                         ;       DebugLog "adding child node  :"+b3dnode
  796. ame$+"  to  "+ tmp
  797. ame$
  798.                                 ;dad.nodechunk=getnodechunk(GetParent (b3dnodejoint))
  799.                                 ;b3dnodeone=createRay.ray(EntityX#(dadjoint,1),EntityY#(dadjoint,1),EntityZ#(dadjoint,1),EntityX#(b3dnodejoint,1),EntityY#(b3dnodejoint,1),EntityZ#(b3dnodejoint,1), punit#*0.1,dadjoint, 1)
  800.                                 ;EntityOrder b3dnodeoneentity,-1
  801.                                 ;UpdateRay(b3dnode.nodechunk)
  802.                         Else
  803.                                
  804.                         ;b3dnodegui_id=AddTreeViewNode( treeJoints, name$ )
  805.                         End If
  806.                 Next
  807.                                
  808.         End If
  809.        
  810.         ;b3dnodegeo=CreateSphere()
  811.         hnd.NodeChunk=b3dnode.NodeChunk
  812.         ;NameEntity b3dnodegeo,"Sphere: " + name$
  813.         ;EntityPickMode b3dnodegeo,2
  814.         ;EntityAlpha b3dnodegeo,0.6
  815.         ;EntityOrder b3dnodegeo,-3
  816.         ;EntityColor b3dnodegeo,0,0,255
  817.         ;EntityParent b3dnodegeo,b3dnodejoint,0
  818.         ;EntityOrder b3dnodegeo,-1 - make optional
  819.         ;HideEntity b3dnodegeo
  820.         ;If b3dnodeent>0 DebugLog EntityName(b3dnodegeo) + " : " + EntityName(b3dnodeent)
  821.         ;joint(NodeCount)=CreateSphere();
  822.         ;ScaleEntity b3dnodegeo,.1,.1,.1;
  823.         ;EntityParent joint(NodeCount),findchildentity(mesh,name$),0;
  824.         ;NodeCount=NodeCount+1;
  825.         ;NewJointNo=NewJointNo+1
  826.         ;PositionEntity ball,x_pos#,y_pos#,z_pos# ,True
  827.  
  828.                         If dumpflags And PMK_FLAG_StripNodePaths Then  name$=StripPath(name$)  
  829.                        
  830.                                                
  831.                        
  832.                 Default
  833.                         ; OBS untested!
  834.  
  835.         ;               out$=BeginTag$(chunk$)
  836.         ;               out$=AddIntegerAttrib(out$,"size",b3dChunkSize())
  837.         ;               out$ = CloseTag(out$)                          
  838.         ;               emit out$
  839.                        
  840.         ;               out$="<![CDATA["
  841.                
  842.         ;               While b3dChunkSize()
  843.         ;                       out$=out$ + Chr$(b3dReadByte())
  844.         ;               Wend
  845.                
  846.         ;               out$=out$ + "]]>"
  847.         ;               emit out$
  848.                
  849.                        
  850.                 End Select
  851.  
  852.                 DumpChunks(dumpflags, tab$,level%)      ;dump any subchunks
  853.                 b3dExitChunk()                                  ;exit this chunk
  854.        
  855.        
  856.                
  857.                
  858.         Wend
  859. End Function
  860.  
  861.  
  862. Function StripPath$(name$)
  863.         Local pos
  864.  
  865.         For pos=Len(name$) To 1 Step -1
  866.                 If Mid$(name$,pos,1)="" Or Mid$(name$,pos,1)="/" Then Exit
  867.         Next
  868.         Return Right$(name$,Len(name$)-pos)
  869.  
  870.  
  871. End Function
  872.  
  873. ;### name   : 1-call recursive child search ###
  874. ;### by     : jonathan pittock (skn3)       ###
  875. ;### contact: skn3@acsv.net                 ###
  876. ;### www    : www.acsv.net                  ###
  877.  
  878. ;This value is used to size the buffer bank below. If the data needs more space,
  879. ;it will resize the bank in blocks of the amount below. (in bytes, 1k = 1024 bytes)
  880. Const recursive_resize=1024
  881.  
  882. ;This bank is used in each call to the search function. It is outside the function,
  883. ;as creating and deleting over and over from memory, can cause fragmentation, not...
  884. ;to mention slow downs.
  885. Global recursive_bank=CreateBank(recursive_resize),recursive_size=recursive_resize
  886.  
  887. ;These are misc values, having them defined as global speeds up the function as...
  888. ;they don't need to be created/destroyed each time the function is called
  889. Global recursive_entity,recursive_parent,recursive_id,recursive_start,recursive_total,recursive_offset
  890.  
  891. ;The function
  892. ;It will return the entity if found, or 0 if not.
  893. ;MyChild=findchildentity(entity,"child name")
  894. Function findchildentity(entity,name$)
  895.         name$=Lower$(name$)
  896.         recursive_parent=entity
  897.         recursive_start=1
  898.         recursive_offset=0
  899.         .recursive_label
  900.                 recursive_total=CountChildren(recursive_parent)
  901.                 For recursive_id=recursive_start To recursive_total
  902.                         recursive_entity=GetChild(recursive_parent,recursive_id)
  903.                         If name$=Lower$(EntityName$(recursive_entity))
  904.                                 Return recursive_entity
  905.                         Else
  906.                                 If recursive_offset+8 > recursive_size-1
  907.                                         ResizeBank(recursive_bank,recursive_size+recursive_resize)
  908.                                         recursive_size=recursive_size+recursive_resize
  909.                                 End If
  910.                                 PokeInt(recursive_bank,recursive_offset,recursive_id+1)
  911.                                 PokeInt(recursive_bank,recursive_offset+4,recursive_parent)
  912.                                 recursive_offset=recursive_offset+8
  913.                                 recursive_start=1
  914.                                 recursive_parent=recursive_entity
  915.                                 Goto recursive_label
  916.                         End If
  917.                 Next
  918.                 If recursive_offset=0
  919.                         Return 0
  920.                 Else
  921.                         recursive_start=PeekInt(recursive_bank,recursive_offset-8)
  922.                         recursive_parent=PeekInt(recursive_bank,recursive_offset-4)
  923.                         recursive_offset=recursive_offset-8
  924.                         Goto recursive_label
  925.                 End If
  926. End Function
  927.  
  928.  
  929.  
  930. ;;;;;;;;;;;;;;;;;;;EXPORT FUNCTIONS:::::::::::::::::::::::::::::::::
  931.  
  932. Function pmk2b3d( f_name$,mesh )
  933.  
  934.         file=WriteFile( f_name$ )
  935.  
  936.         b3dSetFile( file )
  937.        
  938.         b3dBeginChunk( "BB3D" )
  939.         DebugLog "Begin BB3d"
  940.                 b3dWriteInt( 1 )        ;version
  941.                 If b3dtex.texs<>Null  Then
  942.                 b3dBeginChunk("TEXS")
  943.                 DebugLog "Begin Chunk Texs"
  944.                         For x=0 To b3dtex       exs_count%-1
  945.                                 b3dWriteString b3dtex
  946. ame$[x]
  947.                                 b3dWriteInt b3dtexflags%[x]
  948.                                 b3dWriteInt b3dtexlend%[x]
  949.                                 b3dWritefloat b3dtexxpos#[x]
  950.                                 b3dWritefloat b3dtexypos#[x]
  951.                                 b3dWritefloat b3dtexxscale#[x]
  952.                                 b3dWritefloat b3dtexyscale#[x]
  953.                                 b3dWritefloat b3dtex
  954. ot#[x]
  955.                                
  956.                         Next
  957.                        
  958.                 b3dEndChunk();TEXS
  959.                 DebugLog "End Chunk Texs"
  960.                 End If                                                         
  961. .brus                  
  962.                 If b3dbrush.brus <> Null Then
  963.                 For tmpbrush.brus=Each brus
  964.  
  965.                 b3dBeginChunk( "BRUS" )
  966.                 DebugLog "Begin Chunk Brus"
  967.                                 b3dWriteInt tmpbrushrus_tex_count%
  968.  
  969.                         For x=0 To tmpbrushrus_count%-1
  970.                                                                                                                                                 ;0 textures per brush
  971.                                 b3dWriteString  tmpbrush
  972. ame$[x]         ;name
  973.                                 b3dWriteFloat   tmpbrush
  974. ed#[x]                                  ;red
  975.                                 b3dWriteFloat   tmpbrushgrn#[x]                                         ;green
  976.                                 b3dWriteFloat   tmpbrushlu#[x]                                         ;blue
  977.                                 b3dWriteFloat   tmpbrushalp#[x]                                         ;alpha
  978.                                 b3dWriteFloat   tmpbrushshi#[x]                                 ;shininess
  979.                                 b3dWriteInt     tmpbrushlend%[x]                                       ;blend
  980.                                 b3dWriteInt     tmpbrushfx%[x]
  981.                                
  982.                                 For k=0 To tmpbrushrus_tex_count%-1
  983.                                         b3dWriteInt PMK_tex_id% (x,k)
  984.                                 Next
  985.                         ;b3dWriteInt x
  986.  
  987.                         Next   
  988.                                                                        
  989.                
  990.                 b3dEndChunk()   ;end of BRUS chunk
  991.                 DebugLog "End Chunk Brus"
  992.                 Next
  993.                 End If
  994.                 DebugLog "Begin NODE Chunk"
  995.                         b3dBeginChunk("NODE")
  996.                                 b3dWriteString b3dmesh
  997. ame$
  998.                                 b3dWritefloat b3dmeshx_pos#
  999.                                 b3dWritefloat b3dmeshy_pos#
  1000.                                 b3dWritefloat b3dmeshz_pos#
  1001.                                 b3dWritefloat b3dmeshx_scl#
  1002.                                 b3dWritefloat b3dmeshy_scl#
  1003.                                 b3dWritefloat b3dmeshz_scl#
  1004.                                 b3dWritefloat b3dmeshw_rot#
  1005.                                 b3dWritefloat b3dmeshx_rot#
  1006.                                 b3dWritefloat b3dmeshy_rot#
  1007.                                 b3dWritefloat b3dmeshz_rot#
  1008.                                
  1009.                        
  1010.                                 b3dBeginChunk("MESH")
  1011.                                 DebugLog tab$+"Begin Chunk Mesh"
  1012.                                 b3dWriteInt b3dmeshmesh_brush_id
  1013.                                
  1014.                                 b3dBeginChunk("VRTS")
  1015.                                 DebugLog tab$+"Begin Chunk Vrts"
  1016.                                
  1017.                                                         b3dWriteInt b3dmeshvrts_flags%
  1018.                                                         b3dWriteInt b3dmesh     exturecoordsets%
  1019.                                                         b3dWriteInt b3dmesh     exturecoordsize%
  1020.                                                                                                
  1021.                                                                                                                
  1022.                         For x=0 To b3dmeshvrts_count%-1
  1023.                                                        
  1024.                                        
  1025.                                                                 b3dWritefloat b3dmeshx#[x]
  1026.                                                                 b3dWritefloat b3dmeshy#[x]
  1027.                                                                 b3dWritefloat b3dmeshz#[x]
  1028.                        
  1029.                                                                        
  1030.                                                
  1031.                                                 If b3dmeshvrts_flags% And 1
  1032.                                                                 b3dWritefloat b3dmesh
  1033. x#[x]
  1034.                                                                 b3dWritefloat b3dmesh
  1035. y#[x]
  1036.                                                                 b3dWritefloat b3dmesh
  1037. z#[x]                                          
  1038.                                                                                
  1039.                                                 EndIf
  1040.                                                 If b3dmeshvrts_flags% And 2
  1041.                                                                 b3dWritefloat b3dmesh
  1042. #[x]
  1043.                                                                 b3dWritefloat b3dmeshg#[x]
  1044.                                                                 b3dWritefloat b3dmesh#[x]
  1045.                                                                 b3dWritefloat b3dmesha#[x]
  1046.                                                 EndIf
  1047.  
  1048.  
  1049.                                         If b3dmesh      exturecoordsets%=1 Then
  1050.                                
  1051.                                
  1052.                                                 If b3dmesh      exturecoordsize%>0 Then b3dWritefloat b3dmeshu0#[x]
  1053.                                                 If b3dmesh      exturecoordsize%>1 Then b3dWritefloat b3dmeshv0#[x]                            
  1054.                                                 If b3dmesh      exturecoordsize%>2 Then b3dWritefloat b3dmeshw0#[x]
  1055.                                                
  1056.                                         End If
  1057.                                        
  1058.                                         If b3dmesh      exturecoordsets%=2 Then
  1059.                                
  1060.                                                 If b3dmesh      exturecoordsize%>0 Then b3dWritefloat b3dmeshu0#[x]
  1061.                                                 If b3dmesh      exturecoordsize%>1 Then b3dWritefloat b3dmeshv0#[x]                            
  1062.                                                 If b3dmesh      exturecoordsize%>2 Then b3dWritefloat b3dmeshw0#[x]
  1063.  
  1064.                                                 If b3dmesh      exturecoordsize%>0 Then b3dWritefloat b3dmeshu1#[x]
  1065.                                                 If b3dmesh      exturecoordsize%>1 Then b3dWritefloat b3dmeshv1#[x]                            
  1066.                                                 If b3dmesh      exturecoordsize%>2 Then b3dWritefloat b3dmeshw1#[x]
  1067.                                                
  1068.                                         End If
  1069.                                                
  1070.                                
  1071.  
  1072.  
  1073.  
  1074.                         Next
  1075.                         b3dEndChunk();VRTS
  1076.                         DebugLog tab$+"End Chunk Vrts"
  1077.                         For b3dtris.trischunk=Each trischunk
  1078.                        
  1079.                         b3dBeginChunk("TRIS")
  1080.                         DebugLog tab$+"Begin Chunk Tris"
  1081.                        
  1082.                                 b3dWriteInt b3dtris     ris_brush_id%
  1083.                                
  1084.                                 For x = 0 To b3dtris    ris_count%-1
  1085.                                
  1086.                                                 b3dWriteInt b3dtris     v0%[x]
  1087.                                                 b3dWriteInt b3dtris     v1%[x]
  1088.                                                 b3dWriteInt b3dtris     v2%[x]
  1089.                                 Next
  1090.                
  1091.                         b3dEndChunk();TRIS
  1092.                        
  1093.                         Next
  1094.                
  1095.                         DebugLog tab$+"End Chunk Tris"
  1096.                        
  1097.                        
  1098.  
  1099.                
  1100.                
  1101.                        
  1102.                         b3dEndChunk();MESH
  1103.                         DebugLog tab$+"End Chunk Mesh"
  1104.                        
  1105.                         b3dBeginChunk("ANIM")
  1106.                         DebugLog tab$+"Begin Chunk Anim"
  1107.                         b3dWriteInt b3dmeshanim_flags%
  1108.                         b3dWriteInt b3dmeshNum_Frames%
  1109.                         b3dWriteFloat b3dmeshFramesPS#
  1110.                         b3dEndChunk();ANIM
  1111.                         DebugLog tab$+"End Chunk Anim"
  1112.                        
  1113.                         If CountChildren(mesh)>0 Then  
  1114.                                 WriteNodes(mesh); write joint hierarchy
  1115.                        
  1116.                         End If
  1117.                        
  1118.                
  1119.  
  1120.                        
  1121.                         DebugLog "End Chunk ROOT"      
  1122.                         b3dEndChunk();End B3D Chunk
  1123.                        
  1124.                        
  1125.                         CloseFile  file
  1126.                         Return PMK_ERROR_NONE
  1127.                        
  1128. End Function
  1129.  
  1130. Function WriteNodes(parent,tab$="")
  1131.                 tab$=tab$+"      "
  1132.                 WriteNode (parent,tab$)
  1133.                 If CountChildren(parent)>0 Then
  1134.                 For a=1 To CountChildren(parent)
  1135.                         child=GetChild(parent,a)
  1136.                         fin=WriteNodes(child,tab$)
  1137.                        
  1138.                        
  1139.                 Next
  1140.                 End If
  1141.                 b3dEndChunk(); end NODE chunk
  1142.                 DebugLog tab$+"End Chunk NOde ***********"+ EntityName(parent)
  1143.                        
  1144.                
  1145.                        
  1146.        
  1147.         ;If parent=mesh Then    b3dEndChunk(); end NODE chunk
  1148.         ;DebugLog tab$+"End Chunk NOde"+ currname$
  1149.        
  1150.  
  1151.        
  1152. End Function
  1153.  
  1154.  
  1155.  
  1156.  
  1157.  
  1158.  
  1159.  
  1160. Function WriteNode(child,tab$)
  1161.         For tmp.NodeChunk=Each NodeChunk
  1162.                 If tmpjoint=child And tmpclass$="bone" Then
  1163.                                 currname$=tmp
  1164. ame$
  1165.  
  1166.                                 b3dBeginChunk("NODE")
  1167.                                 DebugLog tab$+"Begin Chunk Node  "+currname$
  1168.                                 b3dWriteString tmp
  1169. ame$
  1170.                                 b3dWritefloat tmpx_pos#
  1171.                                 b3dWritefloat tmpy_pos#
  1172.                                 b3dWritefloat tmpz_pos#
  1173.                                 b3dWritefloat tmpx_scl#
  1174.                                 b3dWritefloat tmpy_scl#
  1175.                                 b3dWritefloat tmpz_scl#
  1176.                                 b3dWritefloat tmpw_rot#
  1177.                                 b3dWritefloat tmpx_rot#
  1178.                                 b3dWritefloat tmpy_rot#
  1179.                                 b3dWritefloat tmpz_rot#
  1180.  
  1181.  
  1182.  
  1183.                                        
  1184.  
  1185.  
  1186.  
  1187.                         If tmpclass$="bone" Then
  1188.                                 b3dBeginChunk("BONE")
  1189.                                 DebugLog tab$+"Begin Chunk Bone"
  1190.                        
  1191.                                 ;If tmpweight_count%>0
  1192.                                         For x=0 To b3dmeshvrts_count%-1
  1193.                                                 If tmpvert_target[x]=1
  1194.                                                 b3dWriteInt x
  1195.                                                 b3dWriteFloat tmpweight#[x]
  1196.                                         ;       DebugLog tab$+"VERT "+tmpvert_target%[x]+"  WEIGHT "+tmpweight#[x]
  1197.                                                 End If
  1198.                                         Next
  1199.                                 ;End If
  1200.                         b3dEndChunk(); end BONE Chunk
  1201.                         DebugLog tab$+"End Chunk Bone"
  1202.  
  1203.  
  1204.  
  1205.                         If tmpkeys_count%>0 Then
  1206.                                 b3dBeginChunk("KEYS")
  1207.                                 DebugLog tab$+"Begin Chunk Keys"
  1208.                                
  1209.                                 b3dWriteInt (1);Compressed for now....Pos and Rot only - get flag value at import
  1210.                                
  1211.                                 For x=0 To PMK_MAX_KEYS-1;animframes;b3dmeshNum_Frames%
  1212.                                         If tmpframeP%[x]>-1 Then
  1213.                                         b3dWriteInt x
  1214.                                
  1215.                                 ;       If tmpkeys_flag% And 1
  1216.                        
  1217.                                         b3dWritefloat tmpkey_px#[x]
  1218.                                         b3dWritefloat tmpkey_py#[x]
  1219.                                         b3dWritefloat tmpkey_pz#[x]
  1220.                                
  1221.                                 ;       EndIf
  1222.                        
  1223.                                 ;       If tmpkeys_flag% And 2
  1224.                        
  1225.                                 ;       b3dWritefloat (1.0);tmpkey_sx#[x]
  1226.                                 ;       b3dWritefloat (1.0);tmpkey_sy#[x]
  1227.                                 ;       b3dWritefloat (1.0);tmpkey_sz#[x]
  1228.                        
  1229.                                 ;       End If
  1230.                        
  1231.                                 ;       If tmpkeys_flag% And 4
  1232.                                
  1233.                                 ;       b3dWritefloat tmpkey_rw#[x]
  1234.                                 ;       b3dWritefloat tmpkey_rx#[x]
  1235.                                 ;       b3dWritefloat tmpkey_ry#[x]
  1236.                                 ;       b3dWritefloat tmpkey_rz#[x]
  1237.                                         End If
  1238.                                 Next
  1239.                        
  1240.                         b3dEndChunk(); end KEYS chunk
  1241.                        
  1242.                         ;b3dBeginChunk("KEYS")
  1243.                         ;       DebugLog tab$+"Begin Chunk Keys"
  1244.                                
  1245.                         ;       b3dWriteInt (2);Compressed for now....Pos and Rot only - get flag value at import
  1246.                                
  1247.                         ;       For x=0 To PMK_MAX_KEYS-1;b3dmeshNum_Frames%
  1248.                         ;               If tmpframeS%[x]>-1 Then
  1249.                         ;               b3dWriteInt x
  1250.                                
  1251.                                 ;       If tmpkeys_flag% And 1
  1252.                        
  1253.                                 ;       b3dWritefloat tmpkey_px#[x]
  1254.                                 ;       b3dWritefloat tmpkey_py#[x]
  1255.                                 ;       b3dWritefloat tmpkey_pz#[x]
  1256.                                
  1257.                                 ;       EndIf
  1258.                        
  1259.                                 ;       If tmpkeys_flag% And 2
  1260.                        
  1261.                         ;               b3dWritefloat tmpkey_sx#[x]
  1262.                         ;               b3dWritefloat tmpkey_sy#[x]
  1263.                         ;               b3dWritefloat tmpkey_sz#[x]
  1264.                        
  1265.                                 ;       End If
  1266.                        
  1267.                                 ;       If tmpkeys_flag% And 4
  1268.                                
  1269.                                 ;       b3dWritefloat tmpkey_rw#[x]
  1270.                                 ;       b3dWritefloat tmpkey_rx#[x]
  1271.                                 ;       b3dWritefloat tmpkey_ry#[x]
  1272.                                 ;       b3dWritefloat tmpkey_rz#[x]
  1273.                         ;               End If
  1274.                         ;       Next
  1275.                        
  1276.                 ;       b3dEndChunk(); end KEYS chunk
  1277.                        
  1278.                         b3dBeginChunk("KEYS")
  1279.                                 DebugLog tab$+"Begin Chunk Keys"
  1280.                                
  1281.                                 b3dWriteInt (4);Compressed for now....Pos and Rot only - get flag value at import
  1282.                                
  1283.                                 For x=0 To PMK_MAX_KEYS-1;b3dmeshNum_Frames%
  1284.                                         If tmpframeR%[x]>-1 Then
  1285.                                         b3dWriteInt x
  1286.                                
  1287.                                 ;       If tmpkeys_flag% And 1
  1288.                        
  1289.                                 ;       b3dWritefloat tmpkey_px#[x]
  1290.                                 ;       b3dWritefloat tmpkey_py#[x]
  1291.                                 ;       b3dWritefloat tmpkey_pz#[x]
  1292.                                
  1293.                                 ;       EndIf
  1294.                        
  1295.                                 ;       If tmpkeys_flag% And 2
  1296.                        
  1297.                                 ;       b3dWritefloat (1.0);tmpkey_sx#[x]
  1298.                                 ;       b3dWritefloat (1.0);tmpkey_sy#[x]
  1299.                                 ;       b3dWritefloat (1.0);tmpkey_sz#[x]
  1300.                        
  1301.                                 ;       End If
  1302.                        
  1303.                                 ;       If tmpkeys_flag% And 4
  1304.                                
  1305.                                         b3dWritefloat tmpkey_rw#[x]
  1306.                                         b3dWritefloat tmpkey_rx#[x]
  1307.                                         b3dWritefloat tmpkey_ry#[x]
  1308.                                         b3dWritefloat tmpkey_rz#[x]
  1309.                                         End If
  1310.                                 Next
  1311.                        
  1312.                         b3dEndChunk(); end KEYS chunk
  1313.                         ;PMK_write_physics_nodes(tmp.nodechunk)
  1314.                         DebugLog tab$+"End Chunk Keys"
  1315.                         ;b3dEndChunk();End Node
  1316.                         Return True
  1317.                         End If
  1318.         End If
  1319.        
  1320. End If                 
  1321.                        
  1322. Next
  1323. Return False
  1324. End Function
  1325.  
  1326.  
  1327.  
  1328. ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1329. ;;;;;;;;;;;;;TEST;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1330. ;First Load and Parse File: You will end up with a  NodeChunk type for each node in the model.
  1331. ; There will be a global NodeChunk type for the Mesh node - B3dmesh. This type contains the UV coords in
  1332. ; B3dmeshu0#[vert index],B3dmeshv0#[vert index],B3dmeshw0#[vert index] for set 1 and
  1333. ; B3dmeshu1#[vert index],B3dmeshv1#[vert index],B3dmeshw1#[vert index] for set 2 if exists
  1334. ; Set 2 is normally used for lightmapping and so will not normally be found on animated models.
  1335. Graphics3D 800,600, 16,2
  1336. file1$="oldfile.b3d"
  1337. file2$="newfile.b3d"
  1338. retval=b3d2pmk(file1$);Load and Parse Saving all info to types
  1339. If retval=PMK_ERROR_NONE
  1340.         Repeat  
  1341.                 Text 10,10,"OK - Do whatever you want here ! .
  1342.                 Text 10,20,"Hit Enter to save
  1343.                 Flip
  1344.         Until KeyHit(28)
  1345.         retval=pmk2b3d(file2$,mesh);Save animated model using values held in types
  1346. Else
  1347.         RuntimeError "Error loading file
  1348. End If
  1349. FreeEntity mesh
  1350. FreeBank recursive_bank


Comments :


Bnesiba(Posted 1+ years ago)

 will this save animated .X files as well as animated .b3d?


Damien Sturdy(Posted 1+ years ago)

 No.


ShadowTurtle(Posted 1+ years ago)

 You can write an .X Loader for loading the data into the types and export it as (animated) b3d.


Bnesiba(Posted 1+ years ago)

 ok, if i use loadanimmesh() and load a .x file, then run the pmk2b3d() function will it save an animated .b3d or not?


Ricky Smith(Posted 1+ years ago)

 No, unfortunately Blitz3d only supports import of the DirectX7 animated .x file which doesn't use bones.The file would be saved as a static mesh.You would have to do as Shadow Turtle suggests and write a .X loader first to fill the type values then you could use the pmk2b3d() function to export as .b3d.


bytecode77(Posted 1+ years ago)

 can we access the exact vertex coords of each vertex somehow?and if, how?


Ricky Smith(Posted 1+ years ago)

 One way would be to keep the values in an array of some type and calculate and update the vertex positions manually when the model is animating - taking into consideration the vertex weighting. This would probably be too slow to be useful in  real-time.


H. T. U.(Posted 1+ years ago)

 Thanks, I wanted a way to edit fine details on my b3d models in-game.


jfk EO-11110(Posted 1+ years ago)

 Would be nice to have an Example that shows how to deal with the KeysChunk. Eg. how to alter some keys and save the Animesh with a new/edited animation. Some Field naes don't seem very obvious to me. Anyone?


Ricky Smith(Posted 1+ years ago)

 b3dnodex_pos#
  • =Position key X axis animation frame xb3dnodey_pos#
  • =Position key Y axis frame xb3dnodez_pos#
  • =Position key Z axis frame xb3dnodex_scl#
  • =Scale Key X frame xb3dnodey_scl#
  • =Scale key Y frame xb3dnodez_scl#
  • =Scale Key Z frame xb3dnodew_rot#
  • =W Quaternion(rotation) value for frame xb3dnodex_rot#
  • =X Quaternion(rotation) value for frame xb3dnodey_rot#
  • =Y Quaternion(rotation) value for frame xb3dnodez_rot#
  • =Z Quaternion(rotation) value for frame xJust load the model - set these values and then save to save the animation.
    Code: [Select]
    [/li][/list]
    Graphics3D 800,600, 16,2
    file1$="oldfile.b3d"
    file2$="newfile.b3d"
    retval=b3d2pmk(file1$);Load and Parse Saving all info to types
    If retval=PMK_ERROR_NONE
    Repeat  
    Text 10,10,"Set the animation key values here"
    Text 10,20,"Hit Enter to save
    Flip
    Until KeyHit(28)
    retval=pmk2b3d(file2$,mesh);Save animated model using values held in types
    Else
    RuntimeError "Error loading file
    End If
    FreeEntity mesh
    FreeBank recursive_bank


 

SimplePortal 2.3.6 © 2008-2014, SimplePortal