الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

[blender hacking] نظرة أولية

مغلق
بدأه hasan_aljudy في 8 يناير 2006 · 2 رد · 908 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بالنظر الى المشروع نظرة أولية, نلاحظ انه مقسم الى ثلاث solutions, الاثنان الاوليان intern و extern اظن انهما غير مهمين الان, حسب تصوري انهما مجرد مكتبات معدة مسبقا او شي من هالقبيل .. ساغض الطرف عنها في الوقت الحالي.

الـ solution الأساسي هو blender, و هو يحتوي في داخله على العديد من الـ projects. احد هذه الـ projects اسمه blender, و لكن عند النظر اليه فهو مجرد ملف واحد يحتوي على الـ main function

بدايةً, الـ main قد يبدو معقدا, و لكنه في الحقيقة مجرد initialization و الشغل الحقيقي يبدأ عند الدخول في screenmain
لو تضغطوا F10 و تمشوا على الكود خطوة خطوة, ستلاحظون هذا الامر.

داخل screenmain يوجد loop كبيرة جدا,

while( 1 ) {  // huge loop ..}

تحتوي هذه الـ loop على الية للامساك بالـ events و معالجتها .. و هذا واضح من بعض الأسطر مثل:

else if (event==AUTOSAVE_FILE) {...

و لكن هذا ليس كل شيء في هذه الـ loop, فأنا اتصور ان برنامج مثل الـ blender ليس فقط event driven, اقصد ان البرنامج ممكن ان يقوم بعمليات حتى في حال عدم وجود اي events
بعض هذه العمليات اللتي تتم حتى في عدم وجود اي event قد تكون animations مثلا ..

هذا الجزء من الكود procedural و ليس object oriented, لم الق نظرة كبيرة على باقي المشروع, لكن يبدو ان جزءا كبيرا منه مكتوب بالسي, او على الأقل مكتوب بطريقة procedural و ليس oo.

على كل حال,

لو تركت البرنامج يمشي لوحده بضع ثواني (نصف ثانية كافية), ثم وضعت break point داحل اي نقطة في الـ loop, (مثلا عند اول سطر فيها), ستجد ان البرنامج لن يتوقف .. و لن يصل الى الـ breakpoint مهما تركته من الزمن .. الا اذا قمت بالضغط على نافذته .. عندها فقط ستجد انك وصلت الى الـ breakpoint و أن الـ debugger سلمك البرنامج للتحكم به.

ماذا يعني هذا؟
هذا يعني على الأغلب ان البرنامج يمر في حلقة أخرى في مكان آخر من الكود, ينتظر وصول الـ events لكي يتصرف عليها .. و عندما يصل الـ event فقط سيقوم بالخروج من هناك و العودة الى الـ loop الأصلية لمعالجة هذا الـ event الجديد.

على فرض ان هذه النظرية صحيحة .. سنقوم بترك البرنامج مرة أخرى يعمل لعدة ثواني لوحده .. ثم نذهب الى الـ debugger و نضغط على الزر pause (او لعل اسمه بالحقيقة break all)
سنجد ان البرنامج توقف في مكان ما من الكود .. و سيكون المكان اللذي يصادف ان البرنامج ينفذه الان.
هذا ليس مهما .. المهم اننا نستطيع النظر الى الـ call stack لمعرفة اين يقف الكود الان في بالنسبة لـ screenmain؟

في نافذة الـ call stack, سنجد قائمة بالـ functions اللتي دخلناها .. اذا عملنا دبل كليك على اي عنصر في القائمة, سنرى اين يقف الكود في ذلك الـ function

لو دخلنا الى screenmain سنجد انه واقف عند screen_qread
لو دخلنا الى screen_qread سنجد ما هو واقف عليه .. و هكذا
سنجد في النهاية انه يعتمد على winlay_process_events من اجل استقبال الـ events
هنا سندخل في تعقيدات و تفاصيل لا داعي لها ..

فلنعد الى هذا الـ screenmain
هناك شي لفت نظري .. و هو استدعاء screen_find_area_for_pt
يبدو انها من اجل اكتشاف مكان الماوس بالنسبة للبرنامج .. اذا نظرنا داخل screen_find_area_for_pt سنجد انه يمر على linked list لما يبدو انه screen areas و يحاول تحديد في اي منطقة من الشاشة يقف مؤشر الماوس ..

همممم .... حسنا اذا .. هذه بعض الملاحظات الأولية .. و هي مجرد ملاحظات .. لا أكثر ولا أقل.

بالمناسبة, هذه صورة لتوضيح الـ call stack
08_01_06_11_11_16_1136747476callstack.jp

تم تعديل هذه المشاركة بواسطة مصطفى 36a2 في 23 يونيو 2014 في 11:46 — السبب: add some tags

#2

نظراتي حول بلندر

===================

فضلت أن أضيف مشاركتي مع مشاركة الأستاذ حسن ،، حتى لا تتفرق المواضيع ،،

===================

بعد أن نجحت بالأمس من بناء البلندر على منصة الويندوز بعد ترقية فيجوال السي++ إلى الإصدار 2003،،

أخذت أتجول في نواحي البلندر ، وأخذت أفكر في مميزات المصادر الحرة وكيف أنها ساعدتنا كثيرا في كشف وسبر خفايا تقنية كبيرة جدا، لولاها لبدأنا من الصفر ،، ..

مشروع بلندر مشروع ضخم جدا جدا، يعتمد على تقنيات كثيرة جدا ،، المغري فيه صغر حجمه يعني 10 ميجا كله على بعض مما يوحي أنه مشروع صغير، ولكن هذا وهم يتبدد عندما ترى التقنيات التي استخدمت فيه ،،

وقفت ساعات كثيرة وأنا أمام الجهاز أتصفح الملفات المصدرية ولكن بدون جدوى ،، فطرأت في رأسي فكرة تصفح كل الملفات وفتحها ، وبدأت ،،

تفاجات أول الأمر انه لا يستخدم أي مكتبة معروفة في بناء واجهة المستخدم ، يعني لم يتسخدم API الخاص بالويندوز ولا مكتبة MFC ولا مكتبة GTK ولا مكتبة QT، طبعا هذه المكتبة ليست التي يذكرها الاستاذ سلطان هذه المكتبة تنتجها شركة Trolltech ولا أي مكتبة أخرى حتى مكتبة QuickTime الخاصة بأبل والتي تعمل على الويندوز والماك فقط ، ولا تعمل على اللينكس وبقية المنصات والبرنامج يعمل على جميع المنصات المعروفة .

وبعد ساعات من البحث المتواصل اكتشفت السر ، لقد استخدم كاتبي البلندر تقنية جديدة لبناء واجهة المتسخدم تعتمد على OpenGL تعمل على جميع المنصات اسموها uiBlock ، طبعا كان الهدف منها إيجاد مكتبة سهلة و مرنة بشكل كبير مع الرسوميات ، وكتبت باستخدام لغة السي، طبعا ملفات هذه المكتبة هي :

blender/source/blender/src/interface.c	/* almost all code */
blender/source/blender/include/interface.h  /* internals for previous code */
blender/source/blender/include/BIF_interface.h  /* externals for previous code */

Color and icons stuff has been put in: (unfinished code, under development)
blender/source/blender/src/resources.c 
blender/source/blender/include/BIF_resources.h

Related code:
blender/source/blender/src/toolbox.c (extra GUI elements built on top of this API)

طبعا هم لم يعملوا SDK منفصل عن البلندر ،حتى لا تستخدمها برامج أخرى [حسب قولهم]

طريقة عمل هذه المكتبة قريبا مثلما شرحه الاستاذ حسن ، تكون كالتالي:

- while(looping)

	/* the normal buttons handling */
	- for each block
  - call uiDoBlock (handles buttons for single block)
	- (end for)

	/* at this moment, a new block can be created, for a menu */
	/* so we create a 2nd loop for it */
	- while first block is a menu
  - if block is a menu and not initialized: 
 	 - initalize 'saveunder'
 	 - draw it 
  - get event from queue
  - call uiDoBlock (handles buttons for single block)
  /* here, a new block again can be created, for a sub menu */
  - if return "end" from uiDoBlock
 	 restore 'saveunder's
 	 free all menu blocks
 	 exit from loop
  - do tooltip if nothing has happened
	- (end while)

	- if there was menu, it does this loop once more
   (when you click outside a menu, at another button)

- (end while)

- do tooltip if nothing has happened

يوجد شرح مفصل عن Blender interface.c API toolkit ستجده في مجلد doc اسم الملف interface_API

طبعا لا أحتاج إلى القول أن معظم أجزاء بلندر غير كائنية التوجهة ، لأنها تعتمد على البرمجة الإجرائية ،، وبالتالي ستحتاج إلى وقت كثير جدا حتى تفهم آلية العمل ،،

من اهم ما أحرص عليه عند دراستي لأي مشروع مفتوح المصدر تحرير نافذة حول ، حتى أحس أني أنجزت شيئا ، و هذه نتيجة تعب أمس ،،

14_01_06_11_05_37_1137308737Blender_by_OMLX.JPG

#3

شكراً على مشاركتك أخي العـزيز OMLX .... وقد حللت لي إشكال مكتبات الواجهـة الرسومية .....

بالنسبة لي فسأشارك في هذا المشروع قريباً .. ولكني مشغول جداً بالاختبارات النهائيـة ...

بالمناسبة اكتشفت في إحدى المرات خطأ موجوداً في البلندر :D ... وقمت بوضع صورة للخطأ .. الصورة ضاعت من جهازي ولكني أعطيتها لـ hasan ولا أدري إن كانت موجودة لديه ... إن كانت موجودة فأرجو أن يضعها هـنا

هذا الموضوع مغلق.

مواضيع مشابهة