FaceGen 3 SDKs Reference
Loading...
Searching...
No Matches
Fg3Sam.hpp
1//
2// Copyright (c) Singular Inversions Inc. 2012
3//
4// Authors: Andrew Beatty
5// Created: Feb 14, 2012
6//
7// IBFCS := Internal Base Face Coordinate System
8// Defined for 'InternalBaseFace.tri' (and photofit 'si.tri' for Full SDK).
9// X - face's downward (roughly, head tilted up about 20 degrees)
10// Y - face's left
11// Z - face's forward (roughly, head tilted up about 20 degrees)
12// Origin is arbitrary, units are slightly smaller than millimetres
13//
14
15#ifndef FG3SAM_HPP
16#define FG3SAM_HPP
17
18#include "Fg3Scm.hpp"
19#include "Fg3Face.hpp"
20#include "FgImage.hpp"
21#include "Fg3dMeshIo.hpp"
22#include "FgTransform.hpp"
23#include "FgBounds.hpp"
24
25namespace Fg {
26
33uint32 loadEgm_(String8 const & fname,Vec3Fss & symm,Vec3Fss & asym);
35void saveEgm(String8 const & fname,Vec3Fss const & symm,Vec3Fss const & asym);
36
38struct Ssm3
39{
40 Vec3Fs meanVerts;
41 Vec3Fss symmModes;
42 Vec3Fss asymModes;
43 FG_SER3(meanVerts,symmModes,asymModes)
44
45 Ssm3() {}
47 explicit Ssm3(String8 const & baseName);
48 explicit Ssm3(Vec3Fs const & allVerts) : meanVerts{allVerts} {}
49 Ssm3(Vec3Fs const & allVerts,String8 const & egmFile);
50 Ssm3(Vec3Fs const & allVerts,size_t numSymm,size_t numAsym) : meanVerts(allVerts), symmModes(numSymm), asymModes(numAsym) {}
51
53 bool empty() const {return meanVerts.empty(); }
54 size_t numModes() const {return symmModes.size() + asymModes.size(); }
57 void applyCoord_(Floats const & coord,Vec3Fs & allVerts) const;
59 void applyCoord_(Floats const & symm,Floats const & asym,Vec3Fs & allVerts) const;
61 void applyCoord_(Sam3Coord const & coord,Vec3Fs & allVerts) const;
63 Vec3Fs applyCoord(Sam3Coord const & coord) const
64 {
65 Vec3Fs ret;
66 applyCoord_(coord,ret);
67 return ret;
68 }
69 void saveModes(String8 const & filename) const;
70 void loadModes(String8 const & filename); // meanVerts must be loaded first
71 void transform(SimilarityD const & sim); // ! Transform all coordinates
72};
73typedef Svec<Ssm3> Ssm3s;
74
76struct Sam3
77{
78 Mesh mesh;
80 Scm3s scms;
81
82 Sam3() {}
83 Sam3(Mesh const & m,Ssm3 const & s,Scm3s const & cs) : mesh{m}, ssm{s}, scms{cs} {}
85 explicit Sam3(String8 const & baseName);
86 Sam3(String8 const & ssmBase,String8 const & scmBase);
87 Sam3(String8 const & ssmBase,String8s const & scmBases);
88
90 void applyFace(Face3 const & face);
91 void applyFace(Sam3Coord const & coord,ImgRgba8 const & xfDetail); // Must be 0 or 1 SCMs
92 void transform(SimilarityD const & sim) {mesh.transform_(sim); ssm.transform(sim); }
93};
94typedef Svec<Sam3> Sam3s;
95
96void applyFace_(Face3 const & face,Sam3s & sams);
97Mesh applyPose(std::map<String8,float> pose,Sam3 const & sam);
98Meshes applyPose(std::map<String8,float> pose,Sam3s const & sam3s);
99Mat32F cBounds(Sam3s const &);
100
103{
104 Mesh mesh; // Verts used as output, mean verts stored in 'ssm' below:
105 Ssm3 ssm;
106
107 MeshSsm3() {}
108 explicit MeshSsm3(String8 const & baseName) :
109 mesh {loadMeshAnyFormat(baseName)},
110 ssm {mesh.allVerts(),baseName+".egm"}
111 {}
112 MeshSsm3(String8 const & meshName,String8 const & egmName) :
113 mesh {loadMesh(meshName)},
114 ssm {mesh.allVerts(),egmName}
115 {}
116
117 // Updates the vertex list (and stat morphs) of mesh for the given shape coord (symm + asym):
118 void applyCoord(Floats const & coord);
119 void transform(SimilarityD const & sim) {mesh.transform_(sim); ssm.transform(sim); }
120 // Save mesh with base shape to <baseName>.fgmesh and stats to <baseName>.egm:
121 void save(String8 const & baseName) const;
122};
123
124SimilarityD cIbfcsToHcsi();
125Rigid3D cIbfcsToFccs();
126SimilarityD cIbfcsToFhcs();
127SimilarityD cIbfcsToClientCS(Vec3Fs const & ibfClientVerts);
128SimilarityD cIbfcsToClientCS(String8 const & clientInternalBaseFaceFname);
129void cmdGetInternal(CLArgs const &); // Make a local copy of the FaceGen internal base face mesh
130
133}
134
135#endif
uint32 loadEgm_(String8 const &fname, Vec3Fss &symm, Vec3Fss &asym)
Load statistical shape modes from .EGM file into last two arguments. Returns number of vertices.
Statistical shape model with base mesh.
Definition Fg3Sam.hpp:103
FaceGen face space coordinate.
Definition Fg3Face.hpp:49
Statistical Appearance Model:
Definition Fg3Sam.hpp:77
Scm3s scms
Updates vertex positions in 'mesh'.
Definition Fg3Sam.hpp:80
Sam3()
Updates color maps in 'mesh'. Empty if no maps.
Definition Fg3Sam.hpp:82
void applyFace(Face3 const &face)
Update the shape and color map for 'mesh':
Sam3(String8 const &baseName)
Loads a SAM from all applicable file types starting with 'baseName' (with 0 or 1 color maps):
Ssm3 ssm
Modified by face.
Definition Fg3Sam.hpp:79
FaceGen 3 Statistical Shape Model.
Definition Fg3Sam.hpp:39
Ssm3(String8 const &baseName)
Loads a SSM from all applicable file types starting with 'baseName':
Ssm3()
Asymmetric shape modes (by mode then by vertex). Can be empty.
Definition Fg3Sam.hpp:45
void loadModes(String8 const &filename)
Save modes to .EGM format.
Vec3Fss asymModes
Symmetric shape modes (by mode then by vertex). Can be empty.
Definition Fg3Sam.hpp:42
Vec3Fss symmModes
Base shape. Can be empty.
Definition Fg3Sam.hpp:41
bool empty() const
No valid data currently loaded:
Definition Fg3Sam.hpp:53
Vec3Fs applyCoord(Sam3Coord const &coord) const
Functional version:
Definition Fg3Sam.hpp:63
void applyCoord_(Floats const &symm, Floats const &asym, Vec3Fs &allVerts) const
Calculate vertex positions given just the shape components of a face coordinate and save to 'allVerts...
void applyCoord_(Floats const &coord, Vec3Fs &allVerts) const
void applyCoord_(Sam3Coord const &coord, Vec3Fs &allVerts) const
Calculate the vertex positions for a given face coordinate and save to 'allVerts'.