@@ -51,18 +51,26 @@ void SGameMtl::FillProp (PropItemVec& items, ListItem* owner)
5151 PHelper ().CreateFloat (items, " Factors\\ Density Factor" , &fDensityFactor , 0 .0f , 1000 .0f , 1 .0f , 1 );
5252}
5353
54- void CGameMtlLibrary::CopyMtlPairs (SGameMtl* from, SGameMtl* to )
54+ SGameMtlPair::SGameMtlPair ( const SGameMtlPair &src )
5555{
56- for (GameMtlIt m1_it=materials.begin (); m1_it!=materials.end (); ++m1_it)
57- {
58- SGameMtl* M1 = *m1_it;
59- SGameMtlPair* p_from = GetMaterialPair (from->GetID (), M1->GetID ());
60- SGameMtlPair* p_to = GetMaterialPair (to->GetID (), M1->GetID ());
56+ OwnProps = src.OwnProps ;
57+ ID_parent = src.ID_parent ;
58+ BreakingSounds = src.BreakingSounds ;
59+ StepSounds = src.StepSounds ;
60+ CollideSounds = src.CollideSounds ;
61+ CollideParticles = src.CollideParticles ;
62+ CollideMarks = src.CollideMarks ;
63+ }
6164
62- if (p_from && p_to)
63- p_to->CopyFrom (p_from);
65+ void CGameMtlLibrary::CopyMtlPairs (SGameMtl *src, SGameMtl *dst)
66+ {
67+ for (auto &mtl : materials)
68+ {
69+ SGameMtlPair *srcPair = GetMaterialPair (src->GetID (), mtl->GetID ());
70+ SGameMtlPair *dstPair = GetMaterialPair (dst->GetID (), mtl->GetID ());
71+ if (srcPair && dstPair)
72+ new (dstPair)SGameMtlPair (*srcPair);
6473 }
65-
6674}
6775
6876BOOL CGameMtlLibrary::UpdateMtlPairs (SGameMtl* src)
@@ -126,6 +134,43 @@ void CGameMtlLibrary::RemoveMaterial(LPCSTR name)
126134// ------------------------------------------------------------------------------
127135// material pair routines
128136// ------------------------------------------------------------------------------
137+
138+ static IC bool ValidateParent (const SGameMtlPair *who, const SGameMtlPair *parent)
139+ {
140+ if (!parent)
141+ return true ;
142+ if (who == parent)
143+ return false ;
144+ return ValidateParent (who, parent->m_Owner ->GetMaterialPair (parent->GetParent ()));
145+ }
146+
147+ bool SGameMtlPair::SetParent (int parentId)
148+ {
149+ int ID_parent_save = ID_parent;
150+ ID_parent = parentId;
151+ for (GameMtlPairIt it = m_Owner->FirstMaterialPair (); it != m_Owner->LastMaterialPair (); it++)
152+ {
153+ if (!ValidateParent (*it, m_Owner->GetMaterialPair ((*it)->GetParent ())))
154+ {
155+ ID_parent = ID_parent_save;
156+ return false ;
157+ }
158+ }
159+ // all right
160+ if (GAMEMTL_NONE_ID == ID_parent)
161+ OwnProps.one ();
162+ else
163+ {
164+ OwnProps.zero ();
165+ OwnProps.set (flBreakingSounds, BreakingSounds.size ());
166+ OwnProps.set (flStepSounds, StepSounds.size ());
167+ OwnProps.set (flCollideSounds, CollideSounds.size ());
168+ OwnProps.set (flCollideParticles, CollideParticles.size ());
169+ OwnProps.set (flCollideMarks, CollideMarks.size ());
170+ }
171+ return true ;
172+ }
173+
129174void __fastcall SGameMtlPair::OnFlagChange (PropValue* sender)
130175{
131176 bool bChecked = sender->Owner ()->m_Flags .is (PropItem::flCBChecked);
@@ -155,38 +200,6 @@ IC SGameMtlPair* GetLastParentValue(SGameMtlPair* who, u32 flag)
155200 else return GetLastParentValue (who->m_Owner ->GetMaterialPair (who->GetParent ()),flag);
156201}
157202
158- IC BOOL ValidateParent (SGameMtlPair* who, SGameMtlPair* parent)
159- {
160- if (!parent) return TRUE ;
161- if (who==parent) return FALSE ;
162- else return ValidateParent (who,parent->m_Owner ->GetMaterialPair (parent->GetParent ()));
163- }
164-
165- BOOL SGameMtlPair::SetParent (int parent)
166- {
167- int ID_parent_save = ID_parent;
168- ID_parent = parent;
169-
170- for (GameMtlPairIt it=m_Owner->FirstMaterialPair (); it!=m_Owner->LastMaterialPair (); it++){
171- if (!ValidateParent (*it,m_Owner->GetMaterialPair ((*it)->GetParent ()))){
172- ID_parent = ID_parent_save;
173- return FALSE ;
174- }
175- }
176- // all right
177- if (GAMEMTL_NONE_ID==ID_parent){
178- OwnProps.one ();
179- }else {
180- OwnProps.zero ();
181- OwnProps.set (flBreakingSounds, BreakingSounds.size ());
182- OwnProps.set (flStepSounds, StepSounds.size ());
183- OwnProps.set (flCollideSounds, CollideSounds.size ());
184- OwnProps.set (flCollideParticles,CollideParticles.size ());
185- OwnProps.set (flCollideMarks, CollideMarks.size ());
186- }
187- return TRUE ;
188- }
189-
190203void __fastcall SGameMtlPair::FillChooseMtl (ChooseItemVec& items, void * param)
191204{
192205 for (GameMtlIt m0_it=m_Owner->FirstMaterial (); m0_it!=m_Owner->LastMaterial (); m0_it++){
0 commit comments