ต่อจากวันแรก - วันนี้เน้นเรื่อง Unreal integration
Unreal export watcher
ตอนคิดว่าจะทำ export watcher นี่ลองหาวิธีอยู่นาน - จะให้ Blender มาตรวจจับไฟล์ใหม่ยังไง ลง module เพิ่มก็ไม่อยาก
สุดท้ายใช้ bpy.app.timers ซึ่งมัน built-in อยู่แล้วใน Blender - Python pure ไม่ต้องลงอะไรเพิ่ม
วิธีคือ Blender จะ poll ~/BlenderExports/ เป็นระยะ พอเจอไฟล์ใหม่ก็ค่อยๆ process
แต่ปัญหาคือ มันเช็คทุกครั้งก็เปลือง resource - เลยต้องมี flag ว่า file นี้ process ไปแล้วหรือยัง ตอนแรกใช้ชื่อตัวแปรว่า _processed_fbx_files แต่พอ export ได้ทั้ง FBX, OBJ, glTF ก็เลยเปลี่ยนเป็น _processed_files - ปกติแหละ แต่ตอน debug มันหานานว่าทำไม NameError
UDP notification ก็เลยต้องทำ เพราะถ้ารอ timer นานเกินไป user ก็รู้สึกว่าช้า - ส่ง packet บอก Blender ให้มัน process ทันทีที่ export เสร็จ
plugin structure ก็ standard C++ module ของ Unreal ธรรมดา - มี commands, executor, module ครบ
v0.9.1 - UI/UX refinements
version นี้ไม่ได้เพิ่ม feature ใหม่ แต่เก็บงานเล็กๆ น้อยๆ ที่มันรก
เรื่อง texture assignment ที่ socket ผิดนี่ ตอน debug นานมาก - normal map มันไปเสียบ Base Color ซะงั้น เพราะ Blender มัน assign ไปที่ socket แรกที่ว่าง
เลยต้องบอกมันตรงๆ ว่า socket นี้คือ socket นี้ - Normal → Normal, Roughness → Roughness ไม่ใช่ว่ามันจะเดาเอง
texture type dropdown ตอนแรกใช้ Scene - พอ open file ใหม่ก็ reset ทุกที หงุดหงิด ก็เลยเปลี่ยนมาใช้ WindowManager แทน มัน persistent กว่า
ปุ่ม "Set Up Collection" ที่ rename มาจากชื่อเดิมที่จำไม่ได้ - ชื่อนี้มันชัดเจนกว่าเยอะ บอกตรงๆ ว่าทำอะไร
panel ordering ก็ต้อง hack ด้วย - Blender มัน sort ตามลำดับที่ register - ก็เลยต้องตั้งชื่อให้มันเรียงได้ถูกต้อง FAB_PT_aa_autofix_panel พอใส่ aa ไปก็ขึ้นก่อนตัวอื่น
ของที่ surprise ตอนทำ
starter cube ที่ Blender สร้างมาให้ตอน new file - ตอน enable addon มันก็โดน process ด้วย ซะงั้น เพราะตอน scan objects ใหม่ทั้งหมดเลย ก็เลยต้องเช็คก่อนว่า object นี้มัน imported มาจาก FAB หรือเปล่า
GLTF/GLB/USDZ material corruption ก็ unexpected - พวกนี้มันมี material ของตัวเองอยู่แล้ว พอเราไป modify มันก็เสีย ก็เลยต้อง check ก่อนว่าเป็น FAB material จริงๆ ถึงค่อยแต่ง
collection naming ก็ต้อง sanitize ด้วย - vault folder มันมี ID ติดมาเช่น Warrior-e0dbddd5 ถ้าเอาชื่อนี้ไปสร้าง collection ก็ดูรก ก็เลย strip ID ออก
texture folder detection ก็ซับซ้อนกว่าที่คิด - FAB assets มันเก็บ texture ไว้หลายที่ บางที่อยู่ใน additional-files/textures/ บางที่อยู่ใน textures/ โดยตรง ก็เลยต้องลำดับความสำคัญในการหา
สรุปวันนี้: Unreal export watcher + UI refinements - export watcher มันทำให้ workflow มันลื่นขึ้นเยอะ ตอนกด export ใน Unreal ก็จบเลยไม่ต้องมาสลับหน้าต่าง