গাছের মতো অ্যারে আমার কাছে বিজয়ের মতো শোনাচ্ছে। আপনার শ্রেণিবিন্যাসের কেবল গভীরতার প্রথম ট্রভারসাল করুন এবং একটি অ্যারে পূরণ করুন; পুনরাবৃত্তির মধ্য দিয়ে রিওয়াইন্ডিং করার সময় আপনি হয় সন্তানের কাছে পরম সূচক সহ পিতামাতাকে আপডেট করতে পারেন বা কেবল ব-দ্বীপ-থেকে-আমাকে করতে পারেন, এবং বাচ্চারা পিতা-মাতার সূচকগুলি যে কোনওভাবে সংরক্ষণ করতে পারে। প্রকৃতপক্ষে, আপনি যদি আপেক্ষিক অফসেট ব্যবহার করেন তবে আপনার চারপাশের মূল ঠিকানাটি বহন করার দরকার নেই। আমি মনে করি কাঠামোটি সম্ভবত এর মতো কিছু হবে
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
তবে দুটি "অবস্থান" লেখায় কেবল যুক্ত করুন ))