Revision Difference
util.GetModelMeshes#565471
<function name="GetModelMeshes" parent="util" type="libraryfunc">
<description>
Retrieves vertex, triangle, and bone data for the visual meshes of a given model.
<note>
This does not work on brush models (Models with names in the format `*number`)
</note>
</description>
<realm>Shared</realm>
<args>
<arg name="model" type="string">
The full path to the model to get the visual meshes of.
</arg>
<arg name="lod" type="number" default="0">
Which of the model's Level of Detail (LOD) models to retrieve.
`0` is the best quality with higher numbers progressively lowering the quality.
</arg>
<arg name="bodygroupMask" type="number" default="0">
The combination of bodygroups to retrieve meshes for.
<arg name="bodygroupMask" type="string|number" default="0">
The combination of bodygroups to retrieve meshes for. This can also be a specially formatted bitflag.
For more information, see <page>Entity:SetBodyGroups</page>
</arg>
</args>
<rets>
<ret name="modelMeshes" type="table">⤶
A sequential table of <page text="ModelMeshData Structures">Structures/ModelMeshData</page>⤶
⤶
Each index in this table corresponds to a mesh within the model passed as an argument to this function.
<ret name="modelMeshes" type="table<Structures/ModelMeshData>">⤶
Each index in this table corresponds to a mesh within the model passed as an argument to this function.⤶
⤶
The mesh data is raw, and is not transformed via bone transformations. That's what the second return value is for.
</ret>
<ret name="modelBindPoses" type="table">⤶
A sequential table of <page text="BoneBindPose Structures">Structures/BoneBindPose</page>⤶
⤶
This tables indices are bone IDs for the <page>Structures/BoneBindPose</page> stored at each index.⤶
<ret name="modelBindPoses" type="table<Structures/BoneBindPose>">⤶
This tables indices are bone IDs for the <page>Structures/BoneBindPose</page> stored at each index.⤶
</ret>
</rets>
</function>
<example>
<description>
A snippet of Entity code that renders a wireframe helicopter bomb by retrieving the model's mesh and using it to create a new mesh.
</description>
<code>
-- The default material to render with in case we for some reason don't have one
local myMaterial = Material( "models/wireframe" ) -- models/debug/debugwhite
function ENT:CreateMesh()
-- Destroy any previous meshes
if ( self.Mesh ) then self.Mesh:Destroy() end
-- Get a list of all meshes of a model
local visualMeshes = util.GetModelMeshes( "models/combine_helicopter/helicopter_bomb01.mdl" )
-- Make sure the model exists before continuing
if ( !visualMeshes ) then return end
-- Select the first mesh
local visualMesh = visualMeshes[ 1 ]
-- Set the material to draw the mesh with from the model data
myMaterial = Material( visualMesh.material )
-- You can apply any changes to visualMesh.verticies table here, distorting the mesh
-- or any other changes you can come up with
-- Create and build the mesh
self.Mesh = Mesh()
self.Mesh:BuildFromTriangles( visualMesh.triangles )
end
-- A special hook to override the normal mesh for rendering
function ENT:GetRenderMesh()
-- If the mesh doesn't exist, create it!
if ( !self.Mesh ) then return self:CreateMesh() end
return { Mesh = self.Mesh, Material = myMaterial }
end
function ENT:Draw()
-- Draw the entity's model normally, this will internally call ENT:GetRenderMesh()
self:DrawModel()
end
</code>
</example>