diff --git a/src/lib/StdAdaptors.h b/src/lib/StdAdaptors.h index f6d1439f9..d4f0803ae 100644 --- a/src/lib/StdAdaptors.h +++ b/src/lib/StdAdaptors.h @@ -426,6 +426,9 @@ struct StdArrayDefaultArrayAdapt template inline StdArrayDefaultArrayAdapt mkArrayAdaptDefArr(T *pArray, size_t iSize, const D &rDefault) { return StdArrayDefaultArrayAdapt(pArray, iSize, rDefault); } #define mkArrayAdaptDMA(A, D) mkArrayAdaptDefArr(A, sizeof(A) / sizeof(*(A)), D) +template +inline StdArrayDefaultArrayAdapt mkArrayAdaptDefArrMap(T *pArray, size_t iSize, const D &rDefault, const M &map) { return StdArrayDefaultArrayAdapt(pArray, iSize, rDefault, map); } +#define mkArrayAdaptDMAM(A, D, M) mkArrayAdaptDefArrMap(A, sizeof(A) / sizeof(*(A)), D, M) // * Insertion Adaptor // Compile a value before / after another @@ -934,12 +937,14 @@ struct StdBitfieldAdapt // writing? if (!pComp->isCompiler()) { - T val = rVal; + T val = rVal, orig_val = rVal; // Write until value is comsumed bool fFirst = true; - for (const Entry *pName = pNames; val && pName->Name; pName++) + for (const Entry *pName = pNames; pName->Name; pName++) if ((pName->Val & val) == pName->Val) { + // Avoid writing meaningless none-values (e.g. Category=C4D_None|C4D_Object) + if (orig_val && !pName->Val) continue; // Put "|" if (!fFirst) pComp->Separator(StdCompiler::SEP_VLINE); // Put name diff --git a/src/object/C4Shape.cpp b/src/object/C4Shape.cpp index c9a93351b..c31f2bfe1 100644 --- a/src/object/C4Shape.cpp +++ b/src/object/C4Shape.cpp @@ -528,6 +528,21 @@ void C4Shape::CreateOwnOriginalCopy(C4Shape &rFrom) void C4Shape::CompileFunc(StdCompiler *pComp, const C4Shape *default_shape) { + const StdBitfieldEntry ContactDirections[] = + { + + { "CNAT_None", CNAT_None }, + { "CNAT_Left", CNAT_Left }, + { "CNAT_Right", CNAT_Right }, + { "CNAT_Top", CNAT_Top }, + { "CNAT_Bottom", CNAT_Bottom }, + { "CNAT_Center", CNAT_Center }, + { "CNAT_MultiAttach", CNAT_MultiAttach }, + { "CNAT_NoCollision", CNAT_NoCollision }, + + { NULL, 0 } + }; + // a default shape is given in object compilation context only bool fRuntime = !!default_shape; C4Shape default_def_shape; @@ -540,7 +555,7 @@ void C4Shape::CompileFunc(StdCompiler *pComp, const C4Shape *default_shape) pComp->Value(mkNamingAdapt( VtxNum, "Vertices", default_shape->VtxNum)); pComp->Value(mkNamingAdapt( mkArrayAdaptDMA(VtxX, default_shape->VtxX), "VertexX", default_shape->VtxX)); pComp->Value(mkNamingAdapt( mkArrayAdaptDMA(VtxY, default_shape->VtxY), "VertexY", default_shape->VtxY)); - pComp->Value(mkNamingAdapt( mkArrayAdaptDMA(VtxCNAT, default_shape->VtxCNAT), "VertexCNAT", default_shape->VtxCNAT)); + pComp->Value(mkNamingAdapt( mkArrayAdaptDMAM(VtxCNAT, default_shape->VtxCNAT, [&](decltype(*VtxCNAT) &elem){ return mkBitfieldAdapt(elem, ContactDirections); }), "VertexCNAT", default_shape->VtxCNAT)); pComp->Value(mkNamingAdapt( mkArrayAdaptDMA(VtxFriction, default_shape->VtxFriction), "VertexFriction", default_shape->VtxFriction)); pComp->Value(mkNamingAdapt( ContactDensity, "ContactDensity", default_shape->ContactDensity)); pComp->Value(mkNamingAdapt( FireTop, "FireTop", default_shape->FireTop));