خلاصه

CPlusPlus SOP به شما امکان می‌دهد اپراتورهای SOP سفارشی بسازید، با نوشتن پلاگین اختصاصی خودتان با زبان C++.

برای جزئیات بیشتر در مورد نحوه ساخت فایل‌های .dll برای استفاده در این SOP، به مقالهٔ Write a CPlusPlus Plugin و سایر مقالات دسته‌بندی C++ مراجعه کنید.

کد C++ می‌تواند برای بارگذاری روی GPU یا CPU نوشته شود. توسعه کد برای هر دو حالت تقریباً مشابه است. با این حال، اگر در کد C++ فلگ directToGPU تنظیم شود، فقط یکی از این دو حالت به‌عنوان حالت معتبر شناخته می‌شود. برای هر یک از این دو حالت، کلاس‌های متفاوتی در نظر گرفته شده است. بنابراین، هنگام تنظیم فلگ directToGPU روی true یا false، باید از کلاس‌ها و توابع متفاوتی در متدهای execute() یا executeVBO() استفاده شود.

در حالت CPU:

  • داده‌های هندسی می‌توانند به‌صورت تک‌به‌تک یا همه‌با‌هم اضافه شوند.

  • در این حالت، CPlusPlus SOP می‌تواند از ورودی‌های سیم‌کشی شده SOP و همچنین SOP to DAT، SOP to CHOP یا خروجی SOPهای دیگر استفاده کند.

  • همچنین اپراتورهای DAT، CHOP، TOP غیرسیم‌کشی شده هم می‌توانند به‌عنوان پارامتر سفارشی به کار روند. در این صورت، این پارامترها باید در کد C++ مدیریت شوند تا ورودی سایر اپراتورها را بپذیرند.

در حالت GPU Direct:

  • مشابه حالت CPU عمل می‌کند، اما نمی‌تواند از خروجی‌های SOP پایین‌دست استفاده کند یا به اپراتورهای SOP to DAT یا SOP to CHOP دسترسی داشته باشد.

  • در این حالت داده‌ها مستقیماً در VBO Buffers اضافه می‌شوند که به‌دلیل آپدیت سریع‌تر، عملکرد بهتری دارد.

  • با این حال، قبل از پر کردن بافرها باید اندازهٔ رأس‌ها و اندیس‌های آرایهٔ وجه‌ها مشخص باشد.

مثال پروژهٔ آماده برای CPlusPlus SOP در ویژوال استودیو (ویندوز) در مسیر زیر موجود است:

C:/Program Files/Derivative/TouchDesigner/Samples/CPlusPlus/SimpleShapesSOP

یا در مسیر نصب سفارشی تاچ‌دیزاینر.
(در macOS این مسیر است:
TouchDesigner.app/Contents/Resources/tfs/Samples/CPlusPlus/SimpleShapesSOP)

پارامترهای سفارشی

پارامترهای سفارشی می‌توانند به‌طور خودکار توسط فایل .dll تولید شده برای C++ SOP ساخته شوند. این صفحه پارامترها از طریق تابع setupParameters() در فایل SimpleShapes.cpp قابل حذف، ویرایش یا اضافه‌کردن است. پارامترهای تعریف‌شده می‌توانند فعال یا غیرفعال شوند، بسته به اینکه برای یک وظیفه خاص معتبر باشند یا نه.

داده‌های هندسی

هندسه در کد C++ SOP می‌تواند توسط هر الگوریتمی تعریف شود یا حتی از فایل‌های خارجی وارد گردد. هندسه‌های قابل پشتیبانی شامل مش‌های مثلثی و سیستم‌های ذره‌ای (Particles) هستند.

نکته: اگر هندسهٔ اولیه شامل چندضلعی‌هایی با بیش از ۳ رأس باشد، باید قبل از اضافه‌کردن به لیست مثلث‌ها، به مثلث‌هایی با اندیس‌های معتبر و مشخص تبدیل شوند.

داده‌های هندسی برای خروجی به TouchDesigner می‌توانند شامل موارد زیر باشند:

  • نقاط (Points)

  • نرمال‌ها (Normals)

  • مختصات بافت (Texture Coordinates)

  • رنگ‌های RGBA

  • اطلاعات مثلثی برای مش‌ها یا سیستم‌های ذره‌ای

  • همچنین ویژگی‌های سفارشی با نام دلخواه، از نوع Float یا Integer، با حداکثر ۴ مؤلفه (مثلاً Cd0, Cd1, Cd2, Cd3).


پارامترها – صفحه Load

  • Plugin Path (plugin): مسیر پلاگینی که می‌خواهید بارگذاری کنید.

  • Re-Init Class (reinit): با فعال‌بودن این پارامتر، نمونهٔ ساخته‌شده از کلاس پلاگین حذف و نمونهٔ جدیدی ساخته می‌شود.

  • Re-Init Class (reinitpulse): بلافاصله کلاس را دوباره مقداردهی اولیه می‌کند.

  • Unload Plugin (unloadplugin): زمانی که مقدار این پارامتر بیشتر از ۱ شود، نمونهٔ کلاس حذف و پلاگین از حافظه خارج می‌شود. اگر چند SOP یک پلاگین را بارگذاری کرده باشند، همه باید آن را unload کنند تا فایل آزاد شود.


ورودی‌های اپراتور

  • Input 0:


کانال‌های Info CHOP

اطلاعات اضافی CPlusPlus SOP از طریق Info CHOP در دسترس است.

کانال‌های رایج SOP Info

  • num_points: تعداد نقاط در این SOP

  • num_prims: تعداد پرایمیتیوها در این SOP

  • num_particles: تعداد ذرات در این SOP

  • last_vbo_update_time: زمان صرف‌شده در رشته (Thread) دیگر برای آپدیت داده‌های هندسی روی GPU از داده‌های CPU این SOP (جزو زمان فریم معمولی محاسبه نمی‌شود).

  • last_meta_vbo_update_time: زمان صرف‌شده در رشته دیگر برای آپدیت داده‌های سطوح متا (مثل metaball یا nurbs) روی GPU از داده‌های CPU.

کانال‌های رایج Operator Info

  • total_cooks: تعداد دفعات cook شدن اپراتور از زمان شروع پروسه

  • cook_time: مدت زمان آخرین cook به میلی‌ثانیه

  • cook_frame: شماره فریمی که این اپراتور آخرین بار cook شد (نسبت به تایم‌لاین کامپوننت)

  • cook_abs_frame: شماره فریمی که آخرین بار cook شد (نسبت به زمان مطلق)

  • cook_start_time: زمان شروع cook در فریم جاری (میلی‌ثانیه)

  • cook_end_time: زمان پایان cook در فریم جاری (میلی‌ثانیه)

  • cooked_this_frame: مقدار 1 اگر اپراتور در همین فریم cook شده باشد

  • warnings: تعداد هشدارهای این اپراتور (در صورت وجود)

  • errors: تعداد خطاهای این اپراتور (در صورت وجود)