|
@@ -585,6 +585,8 @@ void tnsset_ObjectDLocationARR(tnsObject* o, real* arr){ tnsVectorCopy3d(arr,o->
|
|
void tnsset_ObjectDRotationARR(tnsObject* o, real* arr){ tnsVectorCopy3d(arr,o->DRotation); tnsDeltaTransformValueChanged(o); laNotifyUsers("tns.world"); }
|
|
void tnsset_ObjectDRotationARR(tnsObject* o, real* arr){ tnsVectorCopy3d(arr,o->DRotation); tnsDeltaTransformValueChanged(o); laNotifyUsers("tns.world"); }
|
|
void tnsset_ObjectDScale(tnsObject* o, real val){ o->DScale=val; tnsDeltaTransformValueChanged(o); laNotifyUsers("tns.world"); }
|
|
void tnsset_ObjectDScale(tnsObject* o, real val){ o->DScale=val; tnsDeltaTransformValueChanged(o); laNotifyUsers("tns.world"); }
|
|
|
|
|
|
|
|
+tnsMeshObject* tnsget_ObjectAsMesh(tnsObject* o){ if(!o || o->Type!=TNS_OBJECT_MESH) return 0; return o; }
|
|
|
|
+
|
|
void laget_UiTemplateIdentifier(laUiTemplate *uit, char *result, char** here){
|
|
void laget_UiTemplateIdentifier(laUiTemplate *uit, char *result, char** here){
|
|
*here=uit->Identifier->Ptr;
|
|
*here=uit->Identifier->Ptr;
|
|
}
|
|
}
|
|
@@ -786,7 +788,10 @@ int lafilter_NodeCategory(void* unused, laNodeCategory* c){
|
|
}
|
|
}
|
|
|
|
|
|
void tnspost_Object(tnsObject *o){
|
|
void tnspost_Object(tnsObject *o){
|
|
- /* what */
|
|
|
|
|
|
+ laListItemPointer* NextLip;
|
|
|
|
+ for(laListItemPointer* lip=o->ChildObjects.pFirst;lip;lip=NextLip){
|
|
|
|
+ NextLip=lip->pNext; if(!lip->p){ lstRemoveItem(&o->ChildObjects,lip); memFree(lip); }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
void tnspropagate_Object(tnsObject* o, laUDF* udf, int force){
|
|
void tnspropagate_Object(tnsObject* o, laUDF* udf, int force){
|
|
for(laListItemPointer* lip=o->ChildObjects.pFirst;lip;lip=lip->pNext){ if(!lip->p) continue;
|
|
for(laListItemPointer* lip=o->ChildObjects.pFirst;lip;lip=lip->pNext){ if(!lip->p) continue;
|
|
@@ -816,6 +821,7 @@ void* tnsget_MeshObjectFaceRaw(tnsMeshObject* o, int* r_size, int* r_is_copy){
|
|
arrEnsureLength(&arr, i+o->f[f].looplen+2, &max, sizeof(int));
|
|
arrEnsureLength(&arr, i+o->f[f].looplen+2, &max, sizeof(int));
|
|
arr[i]=o->f[f].looplen; i++;
|
|
arr[i]=o->f[f].looplen; i++;
|
|
arr[i]=o->f[f].flags; i++;
|
|
arr[i]=o->f[f].flags; i++;
|
|
|
|
+ arr[i]=o->f[f].mat; i++;
|
|
for(int l=0;l<o->f[f].looplen;l++){
|
|
for(int l=0;l<o->f[f].looplen;l++){
|
|
arr[i]=o->f[f].loop[l]; i++;
|
|
arr[i]=o->f[f].loop[l]; i++;
|
|
}
|
|
}
|
|
@@ -838,6 +844,7 @@ void tnsset_MeshObjectFaceRaw(tnsMeshObject* o, int* data, int s){
|
|
tnsFace*f=&o->f[fi];
|
|
tnsFace*f=&o->f[fi];
|
|
f->looplen=data[i]; i++;
|
|
f->looplen=data[i]; i++;
|
|
f->flags=data[i]; i++;
|
|
f->flags=data[i]; i++;
|
|
|
|
+ f->mat=data[i]; i++;
|
|
f->loop=calloc(1,sizeof(int)*f->looplen);
|
|
f->loop=calloc(1,sizeof(int)*f->looplen);
|
|
for(int li=0;li<f->looplen;li++){
|
|
for(int li=0;li<f->looplen;li++){
|
|
f->loop[li]=data[i]; i++;
|
|
f->loop[li]=data[i]; i++;
|
|
@@ -845,6 +852,39 @@ void tnsset_MeshObjectFaceRaw(tnsMeshObject* o, int* data, int s){
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void tns_InvalidateMeshWithMaterial(tnsMaterial* m){
|
|
|
|
+ for(tnsMeshObject* o=T->World->AllObjects.pFirst;o;o=o->Base.Item.pNext){
|
|
|
|
+ if(o->Base.Type!=TNS_OBJECT_MESH) continue;
|
|
|
|
+ for(tnsMaterialSlot* ms=o->Materials.pFirst;ms;ms=ms->Item.pNext){
|
|
|
|
+ if(ms->Material==m){ tnsInvalidateMeshBatch(o); break; }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+void tnsset_MaterialColor(tnsMaterial* m, real* c){
|
|
|
|
+ tnsVectorCopy4d(c,m->Color); tns_InvalidateMeshWithMaterial(m); laNotifyUsers("tns.world");
|
|
|
|
+}
|
|
|
|
+void tnsget_MaterialSlotname(tnsMaterialSlot* ms, char *result, char** here){
|
|
|
|
+ if(!ms){ strcpy(result,"?"); return; }
|
|
|
|
+ if(ms->Material&&ms->Material->Name&&ms->Material->Name->Ptr){
|
|
|
|
+ sprintf(result,"%d: %s",ms->Index,ms->Material->Name->Ptr); return;
|
|
|
|
+ }
|
|
|
|
+ sprintf(result,"%d: %s",ms->Index,transLate("<Default Material>"));
|
|
|
|
+}
|
|
|
|
+tnsMaterialSlot* tnsget_FirstMaterialSlot(tnsMeshObject* mo, void* unused){
|
|
|
|
+ return mo->Materials.pFirst;
|
|
|
|
+}
|
|
|
|
+tnsMaterialSlot* tnsget_ActiveMaterialSlot(tnsMeshObject* mo){
|
|
|
|
+ return mo->CurrentMaterial;
|
|
|
|
+}
|
|
|
|
+void tnsset_ActiveMaterialSlot(tnsMeshObject* mo, tnsMaterialSlot* ms){
|
|
|
|
+ memAssignRef(mo,&mo->CurrentMaterial,ms);
|
|
|
|
+}
|
|
|
|
+tnsMaterial* tnsget_FirstMaterial(void* unused1, void* unused2){
|
|
|
|
+ return T->World->Materials.pFirst;
|
|
|
|
+}
|
|
|
|
+tnsMaterial* tnsgetactive_SlotMaterial(tnsMaterialSlot* ms, void* unused){
|
|
|
|
+ return ms->Material;
|
|
|
|
+}
|
|
|
|
|
|
laPropContainer* tnsget_ObjectType(tnsObject* o){
|
|
laPropContainer* tnsget_ObjectType(tnsObject* o){
|
|
switch(o->Type){
|
|
switch(o->Type){
|
|
@@ -886,6 +926,8 @@ laPropContainer* TNS_PC_OBJECT_INSTANCER;
|
|
laPropContainer* TNS_PC_OBJECT_CAMERA;
|
|
laPropContainer* TNS_PC_OBJECT_CAMERA;
|
|
laPropContainer* TNS_PC_OBJECT_LIGHT;
|
|
laPropContainer* TNS_PC_OBJECT_LIGHT;
|
|
laPropContainer* TNS_PC_OBJECT_MESH;
|
|
laPropContainer* TNS_PC_OBJECT_MESH;
|
|
|
|
+laPropContainer* TNS_PC_MATERIAL;
|
|
|
|
+laPropContainer* TNS_PC_MATERIAL_SLOT;
|
|
|
|
|
|
laProp* LA_PROP_CONTROLLER;
|
|
laProp* LA_PROP_CONTROLLER;
|
|
|
|
|
|
@@ -945,6 +987,7 @@ void la_RegisterGeneralProps(){
|
|
p = la_SetGeneralRoot(&MAIN.GeneralCollectionSub, "__general_collection__", "Genral Collection Operations", "Genral Collection Operations");
|
|
p = la_SetGeneralRoot(&MAIN.GeneralCollectionSub, "__general_collection__", "Genral Collection Operations", "Genral Collection Operations");
|
|
laAddOperatorProperty(p, "put_data_block", "Put", "Append Pending Data Block Here", "LA_sub_put_data_block", U'🔗', 0);
|
|
laAddOperatorProperty(p, "put_data_block", "Put", "Append Pending Data Block Here", "LA_sub_put_data_block", U'🔗', 0);
|
|
laAddOperatorProperty(p, "save_instance", "Save Instance", "Save instance as a udf block", "LA_udf_save_instance", 0,0);
|
|
laAddOperatorProperty(p, "save_instance", "Save Instance", "Save instance as a udf block", "LA_udf_save_instance", 0,0);
|
|
|
|
+ laAddOperatorProperty(p, "clear_selection", "Clear Selection", "Clear selected instance", "LA_collection_clear_selection", U'🧹',0);
|
|
}
|
|
}
|
|
|
|
|
|
void lareset_RackPage(laRackPage* rp){
|
|
void lareset_RackPage(laRackPage* rp){
|
|
@@ -999,12 +1042,31 @@ void la_RegisterTNSProps(){
|
|
laAddSubGroup(p, "active_root", "Active Root Object", "Global active root object", "tns_object",0,0,0,offsetof(tnsWorld,ActiveRoot),tnsget_detached_FirstRootObject,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
|
|
laAddSubGroup(p, "active_root", "Active Root Object", "Global active root object", "tns_object",0,0,0,offsetof(tnsWorld,ActiveRoot),tnsget_detached_FirstRootObject,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
|
|
sp = laAddSubGroup(p, "objects", "Objects", "List of all objects", "tns_object",tnsget_ObjectType, 0,0,-1,0,0,0,0,0,0,offsetof(tnsWorld, AllObjects), 0);
|
|
sp = laAddSubGroup(p, "objects", "Objects", "List of all objects", "tns_object",tnsget_ObjectType, 0,0,-1,0,0,0,0,0,0,offsetof(tnsWorld, AllObjects), 0);
|
|
laSubGroupExtraFunctions(sp,tnsfilter_SavableObject,tnsfilter_SavableObject,0,0,0);
|
|
laSubGroupExtraFunctions(sp,tnsfilter_SavableObject,tnsfilter_SavableObject,0,0,0);
|
|
|
|
+ laAddSubGroup(p, "materials", "Materials", "List of all materials", "tns_material",0,0,0,-1,0,0,0,0,0,0,offsetof(tnsWorld, Materials), 0);
|
|
}
|
|
}
|
|
|
|
|
|
p = laAddPropertyContainer("tns_child_object", "Child Object", "Child object linker", 0,0,sizeof(laListItemPointer), 0,0,0);{
|
|
p = laAddPropertyContainer("tns_child_object", "Child Object", "Child object linker", 0,0,sizeof(laListItemPointer), 0,0,0);{
|
|
laAddSubGroup(p, "object", "Object", "Object link", "tns_object",tnsget_ObjectType, 0,0,offsetof(laListItemPointer, p), 0,0,0,0,0,0,0,LA_UDF_REFER);
|
|
laAddSubGroup(p, "object", "Object", "Object link", "tns_object",tnsget_ObjectType, 0,0,offsetof(laListItemPointer, p), 0,0,0,0,0,0,0,LA_UDF_REFER);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ p = laAddPropertyContainer("tns_material", "Material" "Object material", 0,0,0,sizeof(tnsMaterial),0,0,2);{
|
|
|
|
+ TNS_PC_MATERIAL=p;
|
|
|
|
+ laAddStringProperty(p, "name", "Material Name", "The name ff the material", 0,0,0,0,1, offsetof(tnsMaterial, Name), 0,0,0,0,LA_AS_IDENTIFIER);
|
|
|
|
+ laAddFloatProperty(p, "color", "Color", "Base color of the material", LA_WIDGET_FLOAT_COLOR, "R,G,B,A", 0,1,0,0.025, 1, 0,offsetof(tnsMaterial, Color), 0,0,4, 0,0,0,0,tnsset_MaterialColor, 0,0,0);
|
|
|
|
+ ep = laAddEnumProperty(p, "colorful", "Colorful", "Use colorful display", 0,0,0,0,0,offsetof(tnsMaterial, Colorful), 0,0,0,0,0,0,0,0,0,0);{
|
|
|
|
+ laAddEnumItemAs(ep, "NONE", "None", "Display materials normally",0,0);
|
|
|
|
+ laAddEnumItemAs(ep, "COLORFUL", "Colorful", "Display material with colorful halftone",1,0);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ p = laAddPropertyContainer("tns_material_slot", "Material Slot" "Material Slot", 0,0,0,sizeof(tnsMaterialSlot),0,0,1);{
|
|
|
|
+ TNS_PC_MATERIAL_SLOT=p;
|
|
|
|
+ laAddStringProperty(p,"name","Name","Name of the material slot",LA_WIDGET_STRING_PLAIN,0,0,0,0,0,0,tnsget_MaterialSlotname,0,0,LA_READ_ONLY|LA_UDF_IGNORE);
|
|
|
|
+ laAddSubGroup(p, "material", "Material", "Material reference of this slot","tns_material",0,0,0,offsetof(tnsMaterialSlot,Material),tnsget_FirstMaterial,tnsgetactive_SlotMaterial,laget_ListNext,0,0,0,0,LA_UDF_REFER);
|
|
|
|
+ laAddIntProperty(p,"index","Index","Index of the material slot",LA_WIDGET_INT_PLAIN,0,0,0,0,0,0,0,offsetof(tnsMaterialSlot,Index),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
|
|
|
|
+ laAddOperatorProperty(p,"remove","Remove","Remove this material slot","M_remove_material_slot",L'🗴',0);
|
|
|
|
+ }
|
|
|
|
+
|
|
p = laAddPropertyContainer("tns_object", "Object", "3D Object Item", 0,tnsui_BaseObjectProperties,sizeof(tnsObject), tnspost_Object, 0,2);{
|
|
p = laAddPropertyContainer("tns_object", "Object", "3D Object Item", 0,tnsui_BaseObjectProperties,sizeof(tnsObject), tnspost_Object, 0,2);{
|
|
laPropContainerExtraFunctions(p,0,0,0,tnspropagate_Object,tnsui_DefaultObjectPropUiDefine);
|
|
laPropContainerExtraFunctions(p,0,0,0,tnspropagate_Object,tnsui_DefaultObjectPropUiDefine);
|
|
laContainerAnimationFunctions(p,laaction_VerifyRootObject);
|
|
laContainerAnimationFunctions(p,laaction_VerifyRootObject);
|
|
@@ -1051,6 +1113,7 @@ void la_RegisterTNSProps(){
|
|
laAddSubGroup(p, "drivers", "Drivers", "Driver page collection","la_driver_collection",0,0,0,offsetof(tnsObject,Drivers),0,0,0,0,0,0,0,LA_UDF_SINGLE|LA_HIDE_IN_SAVE);
|
|
laAddSubGroup(p, "drivers", "Drivers", "Driver page collection","la_driver_collection",0,0,0,offsetof(tnsObject,Drivers),0,0,0,0,0,0,0,LA_UDF_SINGLE|LA_HIDE_IN_SAVE);
|
|
laAddOperatorProperty(p, "add_driver_page", "Add Page", "Add a driver page","LA_add_driver_page",'+',0);
|
|
laAddOperatorProperty(p, "add_driver_page", "Add Page", "Add a driver page","LA_add_driver_page",'+',0);
|
|
laAddOperatorProperty(p, "remove_root", "Remove root", "Remove the root node","M_remove_root",L'🗴',0);
|
|
laAddOperatorProperty(p, "remove_root", "Remove root", "Remove the root node","M_remove_root",L'🗴',0);
|
|
|
|
+ laAddSubGroup(p, "as_mesh", "As Mesh", "As mesh object", "tns_mesh_object",0,0,0,-1,0,tnsget_ObjectAsMesh,0,0,0,0,0,LA_UDF_REFER|LA_READ_ONLY|LA_UDF_IGNORE);
|
|
}
|
|
}
|
|
p = laAddPropertyContainer("tns_instancer", "Instancer", "Instance placeholder object", U'📎', tnsui_InstancerObjectProperties,sizeof(tnsInstancer), 0,0,2);{
|
|
p = laAddPropertyContainer("tns_instancer", "Instancer", "Instance placeholder object", U'📎', tnsui_InstancerObjectProperties,sizeof(tnsInstancer), 0,0,2);{
|
|
laPropContainerExtraFunctions(p,0,0,tnstouched_Object,0/*tnspropagate_Object*/,0);
|
|
laPropContainerExtraFunctions(p,0,0,tnstouched_Object,0/*tnspropagate_Object*/,0);
|
|
@@ -1084,6 +1147,11 @@ void la_RegisterTNSProps(){
|
|
//laAddIntProperty(p, "maxv", "Max Vert", "Max Vert count", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, maxv),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
|
|
//laAddIntProperty(p, "maxv", "Max Vert", "Max Vert count", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, maxv),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
|
|
//laAddIntProperty(p, "maxe", "Max Edge", "Max Edge count", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, maxe),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
|
|
//laAddIntProperty(p, "maxe", "Max Edge", "Max Edge count", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, maxe),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
|
|
//laAddIntProperty(p, "maxf", "Max Face", "Max Face count", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, maxf),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
|
|
//laAddIntProperty(p, "maxf", "Max Face", "Max Face count", 0,0,0,0,0,0,0,0,offsetof(tnsMeshObject, maxf),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
|
|
|
|
+ laAddSubGroup(p, "current_material", "Current Material", "Current material slot in this object", "tns_material_slot",0,0,0,offsetof(tnsMeshObject, CurrentMaterial),tnsget_FirstMaterialSlot,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
|
|
|
|
+ laAddSubGroup(p, "materials", "Materials", "Material slots in this mesh object", "tns_material_slot",0,0,0,-1,0,tnsget_ActiveMaterialSlot,0,tnsset_ActiveMaterialSlot,0,0,offsetof(tnsMeshObject, Materials),0);
|
|
|
|
+ laAddOperatorProperty(p,"add_material_slot","Add Material Slot","Add a material slot into this object","M_new_material_slot",L'+',0);
|
|
|
|
+ laAddOperatorProperty(p,"add_material","Add Material","Add a new material to this material slot","M_new_material",'+',0);
|
|
|
|
+ laAddOperatorProperty(p,"assign_material_slot","Assign Material Slot","Assign faces to a current slot","M_assign_material_slot",L'🖌',0);
|
|
}
|
|
}
|
|
p = laAddPropertyContainer("tns_camera", "Camera", "Camera object", U'📷', tnsui_CameraObjectProperties,sizeof(tnsCamera), 0,0,2);{
|
|
p = laAddPropertyContainer("tns_camera", "Camera", "Camera object", U'📷', tnsui_CameraObjectProperties,sizeof(tnsCamera), 0,0,2);{
|
|
//laPropContainerExtraFunctions(p,0,0,0,tnspropagate_Object,0);
|
|
//laPropContainerExtraFunctions(p,0,0,0,tnspropagate_Object,0);
|