पेड़-जैसा-सरणी मुझे एक जीत की तरह लगता है। बस अपनी पदानुक्रम की एक गहराई-पहले ट्रावेल करें और एक सरणी भरें; जब पुनरावृत्ति के माध्यम से रिवाइंड करने से आप या तो माता-पिता को बच्चे को पूर्ण सूचकांक के साथ अपडेट कर सकते हैं या बस डेल्टा-से-मी, और बच्चे माता-पिता के सूचकांकों को किसी भी तरह से स्टोर कर सकते हैं। वास्तव में, यदि आप सापेक्ष ऑफसेट का उपयोग करते हैं तो आपको रूट एड्रेस को इधर-उधर ले जाने की आवश्यकता नहीं है। मुझे लगता है कि संरचना शायद कुछ ऐसी दिखेगी
struct Transform
{
Matrix m; // whatever you like
int parent; // index or offset, you choose!
int sibling;
int firstchild;
};
... इसलिए आपको यह जानने के लिए नोड्स की आवश्यकता होगी कि भाई-बहनों को कैसे प्राप्त करें क्योंकि आप (आसानी से) एक चर आकार की संरचना नहीं कर सकते हैं। यद्यपि मुझे लगता है कि यदि आपने ट्रांसफ़ॉर्म ऑफ़सेट्स के बजाय बाइट ऑफ़सेट्स का उपयोग किया है, तो आप प्रति परिवर्तनशील बच्चों की एक परिवर्तनीय संख्या रख सकते हैं:
struct Transform
{
Matrix m; // whatever you like
int parent; // negative byte offest
int numchildren;
int child[0]; // can't remember if you put a 0 there or leave it empty;
// but it's an array of positive byte offsets
};
... तो आपको केवल यह सुनिश्चित करने की आवश्यकता है कि आपने क्रमिक ट्रांसफ़ॉर्म को सही जगह पर रखा है।
यहां बताया गया है कि आप एम्बेडेड चाइल्ड "पॉइंटर्स" के साथ पूरी तरह से स्व-निहित पेड़ का निर्माण कैसे करते हैं।
int BuildTransforms(Entity* e, OutputStream& os, int parentLocation)
{
int currentLocation = os.Tell();
os.Write(e->localMatrix);
os.Write(parentLocation);
int numChildren = e->GetNumChildren();
os.Write(numChildren);
int childArray = os.Tell();
os.Skip(numChildren * sizeof(int));
os.AlignAsNecessary(); // if you need to align transforms
childLocation = os.Tell();
for (int i = 0; i < numChildren; ++i) {
os.Seek(childArray + (i * sizeof(int)));
os.Write(childLocation);
os.Seek(childLocation);
childLocation = BuildTransforms(e->GetChild(i), os, currentLocation);
}
return os.Tell();
}
void BuildTransforms(Entity* root)
{
OutputStream os;
BuildTransforms(root, os, -1, 0);
}
(यदि आप रिश्तेदार स्थानों को संग्रहीत करना चाहते हैं, तो बस - currentLocation
दो "स्थान" लिखने के लिए जोड़ें।)