20 int32_t texVar, int32_t teethTex, int32_t bodyColor,
23 if(teethTex!=0 || bodyColor!=0 || texVar!=0){
24 if(s.
texName==
"HUM_TEETH_V0.TGA"){
27 else if(s.
texName==
"HUM_MOUTH_V0.TGA"){
30 else if(s.
texName.find_first_of(
"VC")!=std::string::npos){
35 if(mat.
tex==
nullptr) {
37 Tempest::Log::e(
"texture not found: \"",s.
texName,
"\"");
43const Tempest::Texture2d *MeshObjects::solveTex(
const Tempest::Texture2d *def, std::string_view format, int32_t v, int32_t c) {
44 if(format.find_first_of(
"VC")!=std::string::npos){
54 if(proto!=
nullptr && skeleton!=
nullptr)
65 for(
size_t i=0;i<subCount;++i)
70 for(
size_t i=0;i<subCount;++i)
75 for(
size_t i=0;i<subCount;++i)
76 sub[i].setWind(m,intensity);
80 for(
size_t i=0;i<subCount;++i)
81 sub[i].startMMAnim(anim,intensity,timeUntil);
87 auto b = node(0).bounds();
88 for(
size_t i=1; i<subCount; ++i)
89 b.assign(b,sub[i].bounds());
100 *
this = std::move(other);
107 sub.reset(
new Item[mesh.
sub.size()]);
109 for(
size_t i=0;i<mesh.
sub.size();++i) {
111 if(mesh.
sub[i].texName.find_first_of(
"VC")==std::string::npos && version!=0)
113 Item it = owner.implGet(mesh,mesh.
sub[i],0,0,version,staticDraw);
116 sub[subCount] = std::move(it);
122 int32_t texVar, int32_t teethTex, int32_t bodyColor) {
123 sub.reset(
new Item[mesh.
sub.size()]);
125 for(
size_t i=0;i<mesh.
sub.size();++i){
126 Item it = owner.implGet(mesh,mesh.
sub[i],texVar,teethTex,bodyColor,
false);
129 sub[subCount] = std::move(it);
135 int32_t texVar, int32_t teethTex, int32_t bodyColor,
bool staticDraw)
142 auto& att = mesh.
attach[m.id];
143 auto& sub = att.sub[m.subId];
144 Item it = owner.implGet(att,sub,texVar,teethTex,bodyColor,staticDraw);
147 this->sub[subCount] = std::move(it);
151 size_t bonesCount = 0;
152 for(
size_t i=0; i<mesh.
skined.size(); ++i)
153 bonesCount = std::max(bonesCount,mesh.
skined[i].bonesCount);
158 for(
size_t i=0; i<mesh.
skined.size(); ++i) {
159 auto& skin = mesh.
skined[i];
160 for(
auto& m:skin.sub) {
162 mat.
tex=owner.solveTex(mat.
tex,m.texName,texVar,bodyColor);
163 if(mat.
tex!=
nullptr) {
164 sub[subCount] = owner.parent.
get(skin,mat,m.iboOffset,m.iboSize,*anim);
167 if(!m.texName.empty())
168 Tempest::Log::e(
"texture not found: \"",m.texName,
"\"");
173 if(mesh.
morph.size()>0)
178 std::swap(sub, other.sub);
179 std::swap(subCount, other.subCount);
180 std::swap(anim, other.anim);
181 std::swap(proto, other.proto);
182 std::swap(skeleton, other.skeleton);
183 std::swap(binder, other.binder);
188 implSetObjMatrix(mt,skeleton==
nullptr ?
nullptr : skeleton->tr.data());
191void MeshObjects::Mesh::implSetObjMatrix(
const Tempest::Matrix4x4& mt,
const Tempest::Matrix4x4* tr) {
192 const size_t binds = (binder==
nullptr ? 0 : binder->bind.size());
193 for(
size_t i=0; i<binds; ++i) {
194 auto id = binder->bind[i];
195 sub[i].setObjMatrix(tr[
id]);
197 for(
size_t i=binds; i<subCount; ++i)
198 sub[i].setObjMatrix(mt);
206 return it->material();
210 return it->position();
218 return it->meshSlice();
const Tempest::Texture2d * tex
void setPose(const Tempest::Matrix4x4 &obj, const Pose &p)
Mesh & operator=(Mesh &&other)
void setWind(zenkit::AnimationType m, float intensity)
void startMMAnim(std::string_view anim, float intensity, uint64_t timeUntil)
void setObjMatrix(const Tempest::Matrix4x4 &mt)
void setSkeleton(const Skeleton *sk)
const PfxEmitterMesh * toMeshEmitter() const
Tempest::Matrix4x4 position() const
const Material & material() const
const Bounds & bounds() const
std::pair< uint32_t, uint32_t > meshSlice() const
const StaticMesh * mesh() const
MeshObjects(VisualObjects &parent)
const Tempest::Matrix4x4 * transform() const
std::vector< AnimMesh > skined
std::vector< Attach > attach
std::vector< Morph > morph
size_t skinedNodesCount() const
std::vector< SubMeshId > submeshId
static const PfxEmitterMesh * loadEmiterMesh(std::string_view name)
static const Tempest::Texture2d * loadTexture(std::string_view name, bool forceMips=false)
static const AttachBinder * bindMesh(const ProtoMesh &anim, const Skeleton &s)
std::vector< SubMesh > sub
Item get(const StaticMesh &mesh, const Material &mat, size_t iboOffset, size_t iboLength, bool staticDraw)
InstanceStorage::Id alloc(size_t size)