Skip to main content

FlameModel

Struct FlameModel 

Source
pub struct FlameModel {
    pub v_template: Array2<f32>,
    pub faces: Vec<[u32; 3]>,
    pub shapedirs: Array3<f32>,
    pub expressiondirs: Array3<f32>,
    pub posedirs: Array3<f32>,
    pub j_regressor: Array2<f32>,
    pub parents: Vec<i32>,
    pub lbs_weights: Array2<f32>,
    pub n_joints: usize,
}
Expand description

The loaded FLAME parametric head model.

Immutable after construction — call forward with different FlameParams to produce posed meshes.

Fields§

§v_template: Array2<f32>

Template (rest-pose) vertex positions [N, 3].

§faces: Vec<[u32; 3]>

Triangle face indices.

§shapedirs: Array3<f32>

Shape blend-shape directions [N, 3, n_shape].

§expressiondirs: Array3<f32>

Expression blend-shape directions [N, 3, n_expr].

§posedirs: Array3<f32>

Pose corrective blend-shape directions [N, 3, (n_joints-1)*9].

§j_regressor: Array2<f32>

Joint regressor matrix [n_joints, N].

§parents: Vec<i32>

Parent joint index for each joint (root = -1).

§lbs_weights: Array2<f32>

LBS skinning weights [N, n_joints].

§n_joints: usize

Number of joints (5 for FLAME).

Implementations§

Source§

impl FlameModel

Source

pub fn load(dir: impl AsRef<Path>) -> Result<Self, FlameError>

Load a FLAME model from a directory of .npy files produced by scripts/convert_flame.py.

§Errors

Returns an error if:

  • The directory does not exist
  • Required .npy files are missing
  • Array shapes do not match expected dimensions
Source

pub fn num_vertices(&self) -> usize

Number of template vertices (5023 for standard FLAME).

Source

pub fn forward(&self, params: &FlameParams) -> Mesh

Compute the posed mesh from FLAME parameters.

Source

pub fn forward_batch(&self, params_batch: &[FlameParams]) -> Vec<Mesh>

Process multiple parameter sets sequentially.

Shares the model weights across all meshes in the batch.

§Arguments
  • params_batch - Slice of FLAME parameters for each mesh
§Returns

Vector of posed meshes, one per parameter set.

Source

pub fn forward_batch_optimized( &self, params_batch: &[FlameParams], ) -> BatchedFlameOutput

Process multiple parameter sets with pre-allocated output buffers.

This method is more memory-efficient than forward_batch when processing many batches repeatedly, as it returns a BatchedFlameOutput with pre-allocated buffers that can be reused.

§Arguments
  • params_batch - Slice of FLAME parameters for each mesh
§Returns

BatchedFlameOutput containing all vertices and normals with shared faces.

Source

pub fn forward_batch_with_pool( &self, params_batch: &[FlameParams], buffer_pool: &mut BatchBufferPool, ) -> BatchedFlameOutput

Process multiple parameter sets with buffer pool for intermediate values.

This method reuses intermediate buffers across the batch to minimize memory allocations during the forward pass.

§Arguments
  • params_batch - Slice of FLAME parameters for each mesh
  • buffer_pool - Pre-allocated buffer pool for intermediate values
§Returns

BatchedFlameOutput containing all vertices and normals.

§Example
let model = FlameModel::load("path/to/flame")?;
let mut pool = BatchBufferPool::new(16, model.num_vertices(), 5);

// Reuse pool across multiple batch calls
for _ in 0..100 {
    let params_batch: Vec<FlameParams> = vec![/* ... */];
    let output = model.forward_batch_with_pool(&params_batch, &mut pool);
}
Source

pub fn create_buffer_pool(&self, batch_size: usize) -> BatchBufferPool

Create a buffer pool sized for this model.

§Arguments
  • batch_size - Maximum batch size to support
Source

pub fn forward_into( &self, params: &FlameParams, vertices_out: &mut [Point3<f32>], normals_out: &mut [Vector3<f32>], )

Compute the posed mesh, writing directly to provided output buffers.

This method avoids allocation by writing vertices and normals directly to the provided slices.

§Arguments
  • params - FLAME parameters
  • vertices_out - Output buffer for vertices (must have correct size)
  • normals_out - Output buffer for normals (must have correct size)

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more