Game client codebase including: - CharacterActionControl: Character and creature management - GlobalScript: Network, items, skills, quests, utilities - RYLClient: Main client application with GUI and event handlers - Engine: 3D rendering engine (RYLGL) - MemoryManager: Custom memory allocation - Library: Third-party dependencies (DirectX, boost, etc.) - Tools: Development utilities 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
746 lines
25 KiB
OpenEdge ABL
746 lines
25 KiB
OpenEdge ABL
VERSION 1.0 CLASS
|
|
BEGIN
|
|
MultiUse = -1 'True
|
|
Persistable = 0 'NotPersistable
|
|
DataBindingBehavior = 0 'vbNone
|
|
DataSourceBehavior = 0 'vbNone
|
|
MTSTransactionMode = 0 'NotAnMTSObject
|
|
END
|
|
Attribute VB_Name = "CD3DMesh"
|
|
Attribute VB_GlobalNameSpace = False
|
|
Attribute VB_Creatable = True
|
|
Attribute VB_PredeclaredId = False
|
|
Attribute VB_Exposed = False
|
|
|
|
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
'
|
|
' Copyright (C) 1999-2001 Microsoft Corporation. All Rights Reserved.
|
|
'
|
|
' File: D3DMesh.cls
|
|
' Content: D3D VB Framework Mesh
|
|
'
|
|
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
|
|
|
|
Option Explicit
|
|
|
|
Private Type BoneComboIdList
|
|
List(4) As Long
|
|
End Type
|
|
|
|
|
|
' Base Objects
|
|
Public mesh As D3DXMesh 'if not skinned, regular mesh object
|
|
Public skinmesh As D3DXSkinMesh 'if skinned - skinned mesh object
|
|
Public bUseMaterials As Boolean 'Use materials in object
|
|
Public bUseMaterialOverride As Boolean 'Use only override material
|
|
Public ObjectName As String 'Name of object
|
|
Public bSkinned As Boolean 'Inidicates if the object is a skin
|
|
|
|
' Culling objects
|
|
Dim m_SphereCenter As D3DVECTOR 'center of bounding sphere
|
|
Public SphereRadius As Single 'radius of bounding sphere
|
|
Public bHasSphere As Boolean 'Inidcatges if bounding sphere is calculated
|
|
|
|
' Material and Adjacency information
|
|
Dim m_MaterialOverride As D3DMATERIAL8 'Override material to use if bUseMaterialOverride set
|
|
Dim m_NumMaterials As Long 'Number of materials in object
|
|
Dim m_Materials() As D3DMATERIAL8 'Material List
|
|
Dim m_Textures() As Direct3DTexture8 'Texture List
|
|
Dim m_TextureNames() As String 'Texture List Names
|
|
Dim m_AdjBuffer As D3DXBuffer 'Adjacency buffer for the mesh
|
|
|
|
|
|
' Bone and skinning informatin
|
|
Dim m_BoneNames As D3DXBuffer 'Names of Frame objects that are bones
|
|
Dim m_BoneMatrices As D3DXBuffer 'Matrix object per bone
|
|
Dim m_BoneComboTable As D3DXBuffer 'Groupings of bone material and triangles
|
|
Dim m_BoneFrames() As CD3DFrame 'Frame objects that are bones
|
|
Dim m_maxFaceInfl As Long 'Number of matrices that will influence a vertex
|
|
Dim m_worldMatHandles(4) As Long 'handle to multiple world matrices
|
|
Dim m_BoneOffsetMat() As D3DMATRIX 'Bone offset matrices from D3DXBuffers
|
|
Dim m_NumBoneCombos As Long 'Size of bonecombo table
|
|
Dim m_BoneCombos() As D3DXBONECOMBINATION 'Combo table as returned from D3DX
|
|
Dim m_BoneComboIds() As BoneComboIdList 'BoneId portion of combotable
|
|
Dim m_BoneCount As Long 'Number of bones
|
|
Dim m_bonesAttached As Boolean 'Indicates if bones have been attached to the mesh
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Init
|
|
'-----------------------------------------------------------------------------
|
|
Sub Init()
|
|
bUseMaterials = True
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' SphereCenter()
|
|
' returns Sphere Center since D3DVECTOR can not be public variable return value
|
|
'-----------------------------------------------------------------------------
|
|
Property Get SphereCenter() As D3DVECTOR
|
|
SphereCenter = m_SphereCenter
|
|
End Property
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: InitFromFile
|
|
' Desc: Tries first to load mesh in current directory or using explicit path
|
|
' If that fails loads mesh from SDK media path
|
|
'-----------------------------------------------------------------------------
|
|
|
|
Public Function InitFromFile(dev As Direct3DDevice8, Name As String) As Boolean
|
|
Dim mtrlBuffer As D3DXBuffer
|
|
Dim strPath As String
|
|
Destroy
|
|
|
|
' On Local Error Resume Next
|
|
Set m_AdjBuffer = Nothing
|
|
bSkinned = False
|
|
|
|
Set mesh = g_d3dx.LoadMeshFromX(Name, D3DXMESH_MANAGED, dev, m_AdjBuffer, mtrlBuffer, m_NumMaterials)
|
|
If Err.Number <> 0 Then
|
|
Err.Clear
|
|
On Local Error GoTo ErrOut
|
|
strPath = g_mediaPath + Name
|
|
Set mesh = g_d3dx.LoadMeshFromX(strPath, D3DXMESH_MANAGED, dev, m_AdjBuffer, mtrlBuffer, m_NumMaterials)
|
|
|
|
End If
|
|
|
|
Call InitMaterials(g_dev, mtrlBuffer)
|
|
|
|
InitFromFile = True
|
|
Exit Function
|
|
|
|
ErrOut:
|
|
InitFromFile = False
|
|
End Function
|
|
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: InitFromXOF
|
|
' Desc: Load mesh from data provided by XOF api
|
|
' Called from D3DUtil_LoadFromFile
|
|
'-----------------------------------------------------------------------------
|
|
|
|
Public Function InitFromXOF(dev As Direct3DDevice8, meshdata As DirectXFileData) As Boolean
|
|
Dim mtrlBuffer As D3DXBuffer
|
|
Dim bonename As String
|
|
Dim i As Long
|
|
Dim q As Long
|
|
|
|
|
|
Destroy
|
|
|
|
|
|
Set m_AdjBuffer = Nothing
|
|
Set m_BoneMatrices = Nothing
|
|
Set m_BoneNames = Nothing
|
|
Set mesh = Nothing
|
|
Set skinmesh = Nothing
|
|
Set m_BoneMatrices = Nothing
|
|
Set m_BoneComboTable = Nothing
|
|
|
|
ObjectName = meshdata.GetName()
|
|
|
|
' On Local Error GoTo errOut
|
|
bSkinned = False
|
|
|
|
'Users can set this variable to TRUE try the skinned load path
|
|
If g_bLoadSkins = True Then
|
|
Set skinmesh = g_d3dx.LoadSkinMeshFromXof(meshdata, D3DXMESH_MANAGED, dev, m_AdjBuffer, mtrlBuffer, m_NumMaterials, m_BoneNames, m_BoneMatrices)
|
|
|
|
|
|
Dim pAdj As Long, AdjOut As D3DXBuffer
|
|
pAdj = m_AdjBuffer.GetBufferPointer
|
|
|
|
m_BoneCount = skinmesh.GetNumBones()
|
|
|
|
If m_BoneCount = 0 Then
|
|
|
|
''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
' a skinned mesh with no bones is just a regular mesh
|
|
''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
|
|
bSkinned = False
|
|
Set mesh = skinmesh.GetOriginalMesh()
|
|
'Set skinmesh = Nothing
|
|
|
|
Else
|
|
|
|
'''''''''''''''''''''''''''''''''''''''''''''''
|
|
' code specific to x files with skinning data in them
|
|
'''''''''''''''''''''''''''''''''''''''''''''''
|
|
|
|
bSkinned = True
|
|
|
|
Set mesh = skinmesh.ConvertToBlendedMesh(D3DXMESH_MANAGED, ByVal pAdj, ByVal 0, m_NumBoneCombos, m_BoneComboTable, ByVal 0&, Nothing)
|
|
Set m_AdjBuffer = Nothing
|
|
Set m_AdjBuffer = AdjOut
|
|
Set AdjOut = Nothing
|
|
|
|
'retrieve number of influence (matrices) that a vertices could have
|
|
'we support up to 4 corresponding to the 4 world matrices that can be set
|
|
m_maxFaceInfl = skinmesh.GetMaxFaceInfluences()
|
|
|
|
m_worldMatHandles(0) = D3DTS_WORLD
|
|
m_worldMatHandles(1) = D3DTS_WORLD1
|
|
m_worldMatHandles(2) = D3DTS_WORLD2
|
|
m_worldMatHandles(3) = D3DTS_WORLD3
|
|
|
|
ReDim m_BoneCombos(m_NumBoneCombos)
|
|
ReDim m_BoneComboIds(m_NumBoneCombos)
|
|
|
|
' fill in our private table for bone combo data
|
|
' this inidicates which bones (matrices) need to be blended
|
|
' for a given subset in the mesh
|
|
For q = 0 To m_NumBoneCombos - 1
|
|
g_d3dx.BufferGetBoneCombo m_BoneComboTable, q, m_BoneCombos(q)
|
|
g_d3dx.BufferGetBoneComboBoneIds m_BoneComboTable, q, m_maxFaceInfl, m_BoneComboIds(q).List(0)
|
|
Next
|
|
Set m_BoneComboTable = Nothing
|
|
|
|
' fill in our private table for bone offset matrices
|
|
' these are the matrices that give the intitial displacement of mesh subsets
|
|
' release the d3dx buffer to save memory
|
|
ReDim m_BoneOffsetMat(m_BoneCount)
|
|
g_d3dx.BufferGetData m_BoneMatrices, 0, Len(m_BoneOffsetMat(0)), m_BoneCount, m_BoneOffsetMat(0)
|
|
Set m_BoneMatrices = Nothing
|
|
|
|
|
|
End If
|
|
Else
|
|
|
|
Set mesh = g_d3dx.LoadMeshFromXof(meshdata, D3DXMESH_MANAGED, dev, m_AdjBuffer, mtrlBuffer, m_NumMaterials)
|
|
|
|
End If
|
|
|
|
|
|
Call InitMaterials(g_dev, mtrlBuffer)
|
|
|
|
InitFromXOF = True
|
|
Exit Function
|
|
|
|
ErrOut:
|
|
InitFromXOF = False
|
|
End Function
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: AttatchBonesToMesh
|
|
' Desc: Called to attach bones to a skin.
|
|
' The BoneNames table is used to search out bone frames
|
|
' in the children of the given parent frame
|
|
'
|
|
' This must be done for any skinning animation to work
|
|
'-----------------------------------------------------------------------------
|
|
|
|
Friend Sub AttatchBonesToMesh(parent As CD3DFrame)
|
|
' get links to all the frames (bones)
|
|
Dim i As Long
|
|
Dim bonename As String
|
|
ReDim m_BoneFrames(m_BoneCount)
|
|
For i = 0 To m_BoneCount - 1
|
|
bonename = g_d3dx.BufferGetBoneName(m_BoneNames, i)
|
|
Set m_BoneFrames(i) = parent.FindChildObject(bonename, 0)
|
|
If m_BoneFrames(i) Is Nothing Then
|
|
'Debug.Print "unable to find " + bonename
|
|
Stop
|
|
End If
|
|
Next
|
|
m_bonesAttached = True
|
|
Set m_BoneNames = Nothing
|
|
End Sub
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: Optimize
|
|
' Desc: Re-organize the mesh for better performance
|
|
'
|
|
'-----------------------------------------------------------------------------
|
|
|
|
Sub Optimize()
|
|
Dim s As Long
|
|
Dim adjBuf1() As Long
|
|
Dim adjBuf2() As Long
|
|
Dim facemap() As Long
|
|
Dim newmesh As D3DXMesh
|
|
Dim vertexMap As D3DXBuffer
|
|
|
|
s = m_AdjBuffer.GetBufferSize
|
|
ReDim adjBuf1(s / 4)
|
|
ReDim adjBuf2(s / 4)
|
|
|
|
s = mesh.GetNumFaces
|
|
ReDim facemap(s)
|
|
|
|
g_d3dx.BufferGetData m_AdjBuffer, 0, 4, s * 3, adjBuf1(0)
|
|
|
|
Set newmesh = mesh.Optimize(D3DXMESHOPT_ATTRSORT Or D3DXMESHOPT_VERTEXCACHE, adjBuf1(0), adjBuf2(0), facemap(0), vertexMap)
|
|
|
|
If Not newmesh Is Nothing Then
|
|
Set mesh = Nothing
|
|
Set mesh = newmesh
|
|
End If
|
|
|
|
End Sub
|
|
|
|
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: InitMaterials
|
|
' Desc: Helper function for creating mesh materials
|
|
' called after initialization
|
|
'-----------------------------------------------------------------------------
|
|
Private Sub InitMaterials(d3ddevice As Direct3DDevice8, mtrlBuffer As D3DXBuffer)
|
|
Dim i As Long
|
|
|
|
If m_NumMaterials <= 0 Then Exit Sub
|
|
|
|
ReDim m_Materials(m_NumMaterials)
|
|
ReDim m_Textures(m_NumMaterials)
|
|
ReDim m_TextureNames(m_NumMaterials)
|
|
|
|
For i = 0 To m_NumMaterials - 1
|
|
'copy material out of material buffer into our own structure
|
|
g_d3dx.BufferGetMaterial mtrlBuffer, i, m_Materials(i)
|
|
|
|
If g_bLoadNoAlpha Then m_Materials(i).diffuse.a = 1
|
|
|
|
m_Materials(i).Ambient = m_Materials(i).diffuse
|
|
|
|
m_TextureNames(i) = g_d3dx.BufferGetTextureName(mtrlBuffer, i)
|
|
|
|
If g_bUseTextureLoadCallback Then
|
|
Set m_Textures(i) = g_TextureLoadCallback.TextureLoadCallback(m_TextureNames(i))
|
|
Else
|
|
Set m_Textures(i) = D3DUtil_CreateTextureInPool(g_dev, m_TextureNames(i), D3DFMT_UNKNOWN)
|
|
End If
|
|
Next
|
|
|
|
|
|
End Sub
|
|
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: SetFVF
|
|
' Desc: Change the FVF of the current mesh
|
|
'----------------------------------------------------------------------------
|
|
Public Sub SetFVF(dev As Direct3DDevice8, fvf As Long)
|
|
|
|
Dim tempMesh As D3DXMesh
|
|
Dim verts() As D3DVERTEX
|
|
|
|
If mesh Is Nothing Then Exit Sub
|
|
|
|
Set tempMesh = mesh.CloneMeshFVF(D3DXMESH_MANAGED, fvf, dev)
|
|
|
|
|
|
Set mesh = tempMesh
|
|
|
|
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: GenerateNormals
|
|
' Desc: if the current mesh Flexible Vertex Format (FVF) has normals in it
|
|
' that are not initialized. This function will fill them.
|
|
' if no normals are present in the FVF this function will fire an
|
|
' exception
|
|
'----------------------------------------------------------------------------
|
|
Public Sub ComputeNormals()
|
|
Dim bm As D3DXBaseMesh
|
|
Set bm = mesh
|
|
g_d3dx.ComputeNormals bm
|
|
End Sub
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: FlipNormals
|
|
' Desc: Convenience function that flips normals for a D3DVERTEX mesh (default)
|
|
'----------------------------------------------------------------------------
|
|
Public Sub FlipNormals()
|
|
Dim count As Long
|
|
Dim size As Long
|
|
Dim i As Long
|
|
|
|
Dim verts() As D3DVERTEX
|
|
|
|
Dim vb As Direct3DVertexBuffer8
|
|
Set vb = mesh.GetVertexBuffer()
|
|
|
|
|
|
|
|
|
|
size = g_d3dx.GetFVFVertexSize(mesh.GetFVF())
|
|
count = mesh.GetNumVertices()
|
|
|
|
|
|
|
|
If mesh.GetFVF() = D3DFVF_VERTEX Then
|
|
ReDim verts(count)
|
|
|
|
D3DVertexBuffer8GetData vb, 0, size * count, 0, verts(0)
|
|
|
|
For i = 0 To count - 1
|
|
verts(i).nx = -verts(i).nx
|
|
verts(i).ny = -verts(i).ny
|
|
verts(i).nz = -verts(i).nz
|
|
Next
|
|
|
|
D3DVertexBuffer8SetData vb, 0, size * count, 0, verts(0)
|
|
Else
|
|
Stop
|
|
End If
|
|
|
|
|
|
End Sub
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: Translate
|
|
' Desc: all vertices are moved by x,y,z
|
|
' note that object will still rotate about 0,0,0
|
|
'
|
|
'----------------------------------------------------------------------------
|
|
Public Sub Translate(X As Single, Y As Single, z As Single)
|
|
Dim count As Long
|
|
Dim size As Long
|
|
Dim i As Long
|
|
|
|
Dim verts() As D3DVERTEX
|
|
|
|
Dim vb As Direct3DVertexBuffer8
|
|
Set vb = mesh.GetVertexBuffer()
|
|
|
|
|
|
|
|
size = g_d3dx.GetFVFVertexSize(mesh.GetFVF())
|
|
count = mesh.GetNumVertices()
|
|
|
|
|
|
If mesh.GetFVF() = D3DFVF_VERTEX Then
|
|
ReDim verts(count)
|
|
|
|
D3DVertexBuffer8GetData vb, 0, size * count, 0, verts(0)
|
|
|
|
For i = 0 To count - 1
|
|
verts(i).X = verts(i).X + X
|
|
verts(i).Y = verts(i).Y + Y
|
|
verts(i).z = verts(i).z + z
|
|
Next
|
|
|
|
D3DVertexBuffer8SetData vb, 0, size * count, 0, verts(0)
|
|
|
|
End If
|
|
|
|
|
|
End Sub
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: GetLocalBox
|
|
' Desc: Returns the extent of the mesh in the local coordinate system
|
|
'----------------------------------------------------------------------------
|
|
Public Sub GetLocalBox(MinExt As D3DVECTOR, MaxExt As D3DVECTOR)
|
|
g_d3dx.ComputeBoundingBoxFromMesh mesh, MinExt, MaxExt
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: Destroy
|
|
' Desc: release any reference to frame and texture objects
|
|
'-----------------------------------------------------------------------------
|
|
Sub Destroy()
|
|
|
|
'Releases all objects (does leave 1 element in the array)
|
|
ReDim m_Textures(0)
|
|
ReDim m_Materials(0)
|
|
ReDim m_TextureNames(0)
|
|
ReDim m_BoneFrames(0)
|
|
ReDim m_BoneOffsetMat(0)
|
|
ReDim m_BoneCombos(0)
|
|
m_NumMaterials = 0
|
|
bUseMaterials = True
|
|
Set mesh = Nothing
|
|
Set skinmesh = Nothing
|
|
End Sub
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: ComputeBoundingVolumes
|
|
' Desc: Makes BoundingSphere valid
|
|
'-----------------------------------------------------------------------------
|
|
Public Sub ComputeBoundingVolumes()
|
|
g_d3dx.ComputeBoundingSphereFromMesh mesh, m_SphereCenter, SphereRadius
|
|
bHasSphere = True
|
|
End Sub
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: RenderEx
|
|
' Desc: Render Mesh
|
|
' Params:
|
|
' dev the device to draw to
|
|
' bDrawOpaqueSubsets draws all triangles that do not have alpha
|
|
' bDrawOpaqueSubsets draws all triangles that have alpha
|
|
' (note Blending renderstates are modified)
|
|
'
|
|
' Note: do not use for skinned meshes
|
|
'-----------------------------------------------------------------------------
|
|
Sub RenderEx(dev As Direct3DDevice8, bDrawOpaqueSubsets As Boolean, bDrawAlphaSubsets As Boolean)
|
|
If mesh Is Nothing Then Exit Sub
|
|
Dim i As Long
|
|
|
|
'If bSkinned = True Then Exit Sub
|
|
|
|
' Frist, draw the subsets without alpha
|
|
If (bDrawOpaqueSubsets) Then
|
|
For i = 0 To m_NumMaterials - 1
|
|
|
|
|
|
|
|
If (bUseMaterials) Then
|
|
If m_Materials(i).diffuse.a = 1# Then
|
|
g_dev.SetMaterial m_Materials(i)
|
|
|
|
If g_bDontDrawTextures Then
|
|
g_dev.SetTexture 0, Nothing
|
|
Else
|
|
g_dev.SetTexture 0, m_Textures(i)
|
|
End If
|
|
|
|
mesh.DrawSubset i
|
|
End If
|
|
ElseIf (bUseMaterialOverride) Then
|
|
If m_MaterialOverride.diffuse.a = 1# Then
|
|
If g_bDontDrawTextures Then
|
|
g_dev.SetTexture 0, Nothing
|
|
Else
|
|
g_dev.SetTexture 0, m_Textures(i)
|
|
End If
|
|
g_dev.SetMaterial m_MaterialOverride
|
|
mesh.DrawSubset i
|
|
End If
|
|
Else
|
|
mesh.DrawSubset i
|
|
End If
|
|
|
|
Next
|
|
End If
|
|
|
|
|
|
' Then, draw the subsets with alpha
|
|
If (bDrawAlphaSubsets And (bUseMaterialOverride Or bUseMaterials)) Then
|
|
For i = 0 To m_NumMaterials - 1
|
|
|
|
If (bUseMaterials) Then
|
|
If (m_Materials(i).diffuse.a < 1#) Then
|
|
g_dev.SetMaterial m_Materials(i)
|
|
g_dev.SetTexture 0, m_Textures(i)
|
|
mesh.DrawSubset i
|
|
End If
|
|
ElseIf (bUseMaterialOverride) Then
|
|
If (m_MaterialOverride.diffuse.a < 1#) Then
|
|
g_dev.SetMaterial m_MaterialOverride
|
|
g_dev.SetTexture 0, m_Textures(i)
|
|
mesh.DrawSubset i
|
|
End If
|
|
End If
|
|
Next
|
|
End If
|
|
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: Render
|
|
' Desc: Render the mesh to the given device
|
|
'
|
|
' Note: Do not use for skinned meshes
|
|
'
|
|
'-----------------------------------------------------------------------------
|
|
Sub Render(dev As Direct3DDevice8)
|
|
Dim i As Long
|
|
|
|
If mesh Is Nothing Then Exit Sub
|
|
|
|
If bSkinned = True Then Exit Sub
|
|
|
|
If (bUseMaterials) Then
|
|
For i = 0 To m_NumMaterials - 1
|
|
g_dev.SetMaterial m_Materials(i)
|
|
g_dev.SetTexture 0, m_Textures(i)
|
|
mesh.DrawSubset i
|
|
Next
|
|
Else
|
|
For i = 0 To m_NumMaterials - 1
|
|
mesh.DrawSubset i
|
|
Next
|
|
|
|
End If
|
|
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: RenderSkin
|
|
' Desc: Render the Mesh as skin
|
|
' Note: The mesh must have been loaded as a skin and bones must have been attached
|
|
'-----------------------------------------------------------------------------
|
|
Sub RenderSkin()
|
|
|
|
If Not bSkinned Then Exit Sub
|
|
|
|
Dim ipAttr As Long 'bonecombo attribute
|
|
Dim matId As Long 'matrix id
|
|
|
|
Dim i As Long
|
|
Dim mat2 As D3DMATRIX
|
|
Dim mat1 As D3DMATRIX
|
|
Dim mat0 As D3DMATRIX
|
|
|
|
|
|
g_dev.SetRenderState D3DRS_VERTEXBLEND, m_maxFaceInfl - 1
|
|
|
|
For ipAttr = 0 To m_NumBoneCombos - 1
|
|
For i = 0 To m_maxFaceInfl - 1
|
|
matId = m_BoneComboIds(ipAttr).List(i)
|
|
|
|
'If we get a MatId of -1 then all the vertex weights are 0
|
|
'and we dont need to set the transform for this bone
|
|
If matId <> -1 Then
|
|
mat0 = m_BoneFrames(matId).GetUpdatedMatrix()
|
|
mat1 = m_BoneOffsetMat(matId)
|
|
D3DXMatrixMultiply mat2, mat1, mat0
|
|
g_dev.SetTransform m_worldMatHandles(i), mat2
|
|
End If
|
|
Next
|
|
g_dev.SetTexture 0, m_Textures(m_BoneCombos(ipAttr).AttribId)
|
|
g_dev.SetMaterial m_Materials(m_BoneCombos(ipAttr).AttribId)
|
|
|
|
mesh.DrawSubset ipAttr
|
|
|
|
Next
|
|
|
|
g_dev.SetRenderState D3DRS_VERTEXBLEND, 0
|
|
|
|
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: GetMaterialCount
|
|
'
|
|
'---------------------------------------------------------------------------
|
|
Public Function GetMaterialCount() As Long
|
|
GetMaterialCount = m_NumMaterials
|
|
End Function
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: SetMaterialOverride
|
|
' Desc: Sets the materail to be used in place of the ones loaded from file
|
|
' Note: to disable set bUseMaterialOverride to false
|
|
'-----------------------------------------------------------------------------
|
|
Public Sub SetMaterialOverride(m As D3DMATERIAL8)
|
|
m_MaterialOverride = m
|
|
bUseMaterialOverride = True
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: GetMaterialOverride
|
|
' Desc:
|
|
'-----------------------------------------------------------------------------
|
|
Public Sub GetMaterialOverride(m As D3DMATERIAL8)
|
|
m = m_MaterialOverride
|
|
End Sub
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: ClassName
|
|
' Desc:
|
|
'-----------------------------------------------------------------------------
|
|
Public Function ClassName() As String
|
|
ClassName = "CD3DMesh"
|
|
End Function
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: InvalidateDeviceObjects
|
|
' Desc: Release reference to device dependent objects
|
|
'-----------------------------------------------------------------------------
|
|
Public Sub InvalidateDeviceObjects()
|
|
'all framework objects are managed so nothing to do here
|
|
End Sub
|
|
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: RestoreDeviceObjects
|
|
' Desc: If we had any video memory objects they would need
|
|
' to be reloaded here
|
|
'-----------------------------------------------------------------------------
|
|
Public Sub RestoreDeviceObjects(dev As Direct3DDevice8)
|
|
|
|
End Sub
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: InitFromD3DXMesh
|
|
' Desc: Allow mesh objects to be created from external D3DXMesh objects
|
|
'
|
|
'-----------------------------------------------------------------------------
|
|
Sub InitFromD3DXMesh(d3dxmeshIn As D3DXMesh)
|
|
bUseMaterials = False
|
|
ReDim m_Materials(1)
|
|
ReDim m_Textures(1)
|
|
m_NumMaterials = 1
|
|
Set mesh = d3dxmeshIn
|
|
End Sub
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: SetMaterialCount
|
|
' Desc: If a mesh was initialized with InitFromD3DXMesh
|
|
' This function can allocate space for Materials and Textures
|
|
'-----------------------------------------------------------------------------
|
|
Sub SetMaterialCount(n As Long)
|
|
m_NumMaterials = n
|
|
ReDim Preserve m_Materials(n)
|
|
ReDim Preserve m_Textures(n)
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: SetMaterialTexture
|
|
' Desc: Sets the texture for a given material subset
|
|
' Note: use nothing to remove a texture
|
|
'-----------------------------------------------------------------------------
|
|
Sub SetMaterialTexture(n As Long, tex As Direct3DTexture8)
|
|
Set m_Textures(n) = tex
|
|
End Sub
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: GetMaterialTexture
|
|
' Desc: returns a given texture for a material subset
|
|
'-----------------------------------------------------------------------------
|
|
Function GetMaterialTexture(n As Long) As Direct3DTexture8
|
|
Set GetMaterialTexture = m_Textures(n)
|
|
End Function
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: SetMaterial
|
|
' Desc: Sets the material properties for a given material subset
|
|
'-----------------------------------------------------------------------------
|
|
Sub SetMaterial(n As Long, material As D3DMATERIAL8)
|
|
m_Materials(n) = material
|
|
End Sub
|
|
|
|
|
|
'-----------------------------------------------------------------------------
|
|
' Name: GetMaterial
|
|
' Desc: returns material properties for a material subset
|
|
'-----------------------------------------------------------------------------
|
|
Function GetMaterial(n As Long) As D3DMATERIAL8
|
|
GetMaterial = m_Materials(n)
|
|
End Function
|
|
|
|
|