Code archives/3D Graphics - Mesh/B3D mesh/entity debbugger

This code has been declared by its author to be Public Domain code.

Download source code

B3D mesh/entity debbugger by RemiD2016
to analyze the surfaces, vertices, triangles, joints/bones, in your mesh/entity
the number of surfaces, vertices per surface, triangles per surface, pivots/joints/bones, and their names is shown in the debug log (using debuglog(), with debug mode on)
Graphics3D(800,600,32,2) 

HidePointer() 
 
SeedRnd(MilliSecs())

Global Camera = CreateCamera()
CameraRange(Camera,0.01,100)
CameraClsColor(Camera,025,025,025)

Origine = CreateCube()
ScaleMesh(Origine,0.01/2,0.01/2,0.01/2)
EntityColor(Origine,255,000,255)
EntityFX(Origine,1)

DLight = CreateLight(1)
LightColor(DLight,224,224,224)
PositionEntity(DLight,-1000,1000,-1000,True)
RotateEntity(DLight,45,-45,0,True)

AmbientLight(064,064,064)

Global MPX%
Global MPY%
Global MXDiff%
Global MYDiff%

Global InteractionMode%
Const C2D% = 1
Const C3D% = 2
InteractionMode = C3D
HidePointer()

Global GhostRoot
Global GhostRootYaw#
Global GhostEyes
Global GhostEyesPitch#
BuildGhost()

Cube1w1h1dMesh = CreateCube()
ScaleMesh(Cube1w1h1dMesh,1.0/2,1.0/2,1.0/2)
PositionMesh(Cube1w1h1dMesh,0,1.0/2,0)
EntityAlpha(Cube1w1h1dMesh,0.25)

;for a static mesh :
;Global B3DMesh = LoadMesh("zombie.b3d")
;ScaleMesh(B3DMesh,0.1,0.1,0.1)
;NameEntity(B3DMesh,"B3DRoot")

;for a rigged skinned animated mesh :
Global B3DMesh = LoadAnimMesh("zombie.b3d")
ScaleEntity(B3DMesh,0.1,0.1,0.1)
NameEntity(B3DMesh,"B3DRoot")

;to debug surfaces, vertices, triangles :
SCount% = CountSurfaces(B3DMesh)
DebugLog("Mesh has "+SCount+" surface(s).")
For SI% = 1 To SCount Step 1
 Surface = GetSurface(B3DMesh,SI)
 VCount% = CountVertices(Surface)
 TCount% = CountTriangles(Surface)
 DebugLog("Surface"+SI+" has "+VCount+" vertices, "+TCount+" triangles.")
 VTotalCount% = VTotalCount + VCount
 TTotalCount% = TTotalCount + TCount
Next
DebugLog("Mesh has "+VTotalCount+" vertices, "+TTotalCount+" triangles.")

;to debug joints/bones :
Type JB
 Field JBH%
 Field ParentH%
 Field ChildsCount%
 Field ChildH%[10]
 Field State%
End Type

AnalyzeEntity(B3DMesh)

;markers to debug the joints/bones
For i.JB = Each JB
 Marker = CreateSphere(8)
 ScaleMesh(Marker,0.03/2,0.03/2,0.03/2)
 PositionEntityLikeOtherEntity(Marker,i\JBH)
 EntityParent(Marker,i\JBH,True)
Next

PositionEntity(GhostRoot,0,1.65,-3,True)

Global Timer = CreateTimer(30)

Main()

End()

Function Main()

 While( KeyDown(1)<>1 )

  MPX = MouseX()
  MPY = MouseY()
  MXDiff = MouseXSpeed()
  MYDiff = MouseYSpeed()

  UpdateInteractionMode()
  If( InteractionMode = C2D )
   ;
  Else If( InteractionMode = C3D )
   UpdateGhost()
   PositionRotateEntityLikeOtherEntity(Camera,GhostEyes) 	   
  EndIf

  Wireframe(True)

  SetBuffer(BackBuffer())
  RenderWorld()

  Color(255,255,255)
  CText("Triangles = "+TrisRendered(),0,0)

  WaitTimer(Timer)
  VWait():Flip(False)

 Wend

End Function

Function CText(TextStr$,PX%,PY%)
 Text(PX,PY,TextStr,False,False)
End Function

Function PositionEntityLikeOtherEntity(Entity,OEntity)
 PositionEntity(Entity,EntityX(OEntity,True),EntityY(OEntity,True),EntityZ(OEntity,True),True)
End Function

Function RotateEntityLikeOtherEntity(Entity,OEntity)
 RotateEntity(Entity,EntityPitch(OEntity,True),EntityYaw(OEntity,True),EntityRoll(OEntity,True),True)
End Function

Function PositionRotateEntityLikeOtherEntity(Entity,OEntity)
 PositionEntity(Entity,EntityX(OEntity,True),EntityY(OEntity,True),EntityZ(OEntity,True),True)
 RotateEntity(Entity,EntityPitch(OEntity,True),EntityYaw(OEntity,True),EntityRoll(OEntity,True),True)
End Function

Function UpdateInteractionMode() 

 If( KeyHit(15)=1 )
  If( InteractionMode = C2D )
   InteractionMode = C3D
   HidePointer()
  Else If( InteractionMode = C3D )
   InteractionMode = C2D
   ShowPointer()
  EndIf
 EndIf

End Function

Function BuildGhost()
 
 GhostRoot = CreatePivot()

 GhostEyes = CreatePivot()
 PositionRotateEntityLikeOtherEntity(GhostEyes,GhostRoot)
 EntityParent(GhostEyes,GhostRoot,True)

End Function

Function UpdateGhost()

 MoveMouse(GraphicsWidth()/2,GraphicsHeight()/2)
 GhostRootYaw = GhostRootYaw - Float(MXDiff)/10
 RotateEntity(GhostRoot,0,GhostRootYaw,0,False)
 GhostEyesPitch = GhostEyesPitch + Float(MYDiff)/10
 If( GhostEyesPitch < -89 )
  GhostEyesPitch = -89
 Else If( GhostEyesPitch > 89 )
  GhostEyesPitch = 89
 EndIf
 RotateEntity(GhostEyes,GhostEyesPitch,0,0,False)

 If( KeyDown(42) = 0 And KeyDown(29) = 0 )
  Speed# = 0.1
 Else If( KeyDown(42) = 1 And KeyDown(29) = 0 )
  Speed# = 1
 Else If( KeyDown(42) = 0 And KeyDown(29) = 1 )
  Speed# = 0.01
 EndIf

 If( KeyDown(17)=1 )
  MoveEntity(GhostRoot,0,0,Speed)
 Else If( KeyDown(31)=1 )
  MoveEntity(GhostRoot,0,0,-Speed)
 EndIf
 If( KeyDown(30)=1 )
  MoveEntity(GhostRoot,-Speed,0,0)
 Else If( KeyDown(32)=1 )
  MoveEntity(GhostRoot,Speed,0,0)
 EndIf
 If( KeyDown(16)=1 )
  MoveEntity(GhostRoot,0,-Speed,0)
 Else If( KeyDown(18)=1 )
  MoveEntity(GhostRoot,0,Speed,0)
 EndIf

End Function

Function AnalyzeEntity(EntityH)

 JBsCount% = 0

 JBH% = EntityH

 JBsCount = JBsCount + 1
 i.JB = New JB
 i\JBH = JBH
 i\ParentH = 0
 i\ChildsCount = CountChildren(i\JBH)
 For c% = 1 To i\ChildsCount Step 1
  i\ChildH[c] = GetChild(i\JBH,c)
 Next
 i\State = True
 CurrentH% = i\JBH

 .LineAnalyzeCurrent
 DebugLog(CurrentH+"|"+EntityName(CurrentH)+"|"+CountChildren(CurrentH))
 For CI% = 1 To CountChildren(CurrentH) Step 1
  JBH% = GetChild(CurrentH,CI)
  JBsCount = JBsCount + 1
  i.JB = New JB
  i\JBH = JBH 
  i\ParentH = CurrentH
  i\ChildsCount = CountChildren(i\JBH)
  For c% = 1 To i\ChildsCount Step 1
   i\ChildH[c] = GetChild(i\JBH,c)
  Next
  i\State = False
 Next

 For i.JB = Each JB
  If( i\State = False )
   CurrentH = i\JBH
   i\State = True
   Goto LineAnalyzeCurrent
  EndIf
 Next

 DebugLog("Entity has "+JBsCount+" joint(s)/bone(s)")

End Function

Comments

None.

Code Archives Forum