}; extern const hkClass hkvConvexVerticesShapeClass; const hkClass hkvConvexVerticesShapeClass( "hkvConvexVerticesShape", &hkpConvexVerticesShapeClass, // parent sizeof(::hkvConvexVerticesShape), HK_NULL, 0, // interfaces HK_NULL, 0, // enums reinterpret_cast<const hkClassMember*>(hkvConvexVerticesShape::Members), HK_COUNT_OF(hkvConvexVerticesShape::Members), HK_NULL, // defaults HK_NULL, // attributes 0, // flags hkUint32(0) // version ); #ifndef HK_HKCLASS_DEFINITION_ONLY const hkClass& HK_CALL hkvConvexVerticesShape::staticClass() { return hkvConvexVerticesShapeClass; } HK_COMPILE_TIME_ASSERT2( \ sizeof(hkIsVirtual(static_cast<hkvConvexVerticesShape*>(0))) == sizeof(hkBool::CompileTimeTrueType), \ REFLECTION_PARSER_VTABLE_DETECTION_FAILED ); static void HK_CALL finishLoadedObjecthkvConvexVerticesShape(void* p, int finishing = 1) { hkFinishLoadedObjectFlag f; f.m_finishing = finishing; new (p) hkvConvexVerticesShape(f); }
hkString TweakerUtils::setReal( const hkString& memberPath, void* rootData, const hkClass& rootKlass, float newValue ) { if (memberPath.getLength() == 0) return hkString("/"); const hkClass* klass; void* data; hkString classPath = TweakerUtils::getClass(memberPath, rootData, rootKlass, data, klass); hkString memberName = memberPath; if (classPath.getLength() > 0) memberName = memberName.replace(classPath, hkString("")); // deal with arrays int rightBracketIndex = memberName.indexOf( ']' ); int arrayIndex = -1; if ( rightBracketIndex != -1 ) { int leftBracketIndex = memberName.indexOf( '[' ); hkString indexString = memberName.substr( leftBracketIndex + 1, rightBracketIndex - leftBracketIndex - 1 ); arrayIndex = hkString::atoi( indexString.cString() ); memberName = memberName.substr( 0, leftBracketIndex ); } int memberIdx = getMemberIdx(memberName, *klass); if (memberIdx < 0) return classPath; const hkClassMember& member = klass->getMember(memberIdx); void* memberData = static_cast<void*>(static_cast<char*>(data) + member.getOffset()); hkString str; switch (member.getType()) { case hkClassMember::TYPE_REAL : { hkReal& value = lookupMember<hkReal>(memberData); value = newValue; } break; case hkClassMember::TYPE_INT32 : { hkInt32& value = lookupMember<hkInt32>(memberData); value = hkInt32(newValue); } break; case hkClassMember::TYPE_UINT32 : { hkUint32& value = lookupMember<hkUint32>(memberData); value = hkUint32(newValue); } break; case hkClassMember::TYPE_INT16 : { hkInt16& value = lookupMember<hkInt16>(memberData); value = hkInt16(newValue); } break; case hkClassMember::TYPE_UINT16 : { hkUint16& value = lookupMember<hkUint16>(memberData); value = hkUint16(newValue); } break; case hkClassMember::TYPE_BOOL : { bool& value = lookupMember<bool>(memberData); value = (newValue!=0.0f); } break; case hkClassMember::TYPE_ENUM : { // for backward compatibility we clear the data on zero, otherwise do nothing to enums if ( newValue == 0.0f ) { const hkClassEnum& e = member.getEnumType(); member.setEnumValue(memberData, e.getItem(0).getValue()); } } break; case hkClassMember::TYPE_ARRAY: { switch( member.getSubType() ) { case hkClassMember::TYPE_REAL : { void* ptrAddr = static_cast<void*>(memberData); hkArray<hkReal>* arrayPtr = static_cast<hkArray<hkReal>*>( ptrAddr ); (*arrayPtr)[arrayIndex] = newValue; } break; case hkClassMember::TYPE_INT32 : { void* ptrAddr = static_cast<void*>(memberData); hkArray<hkInt32>* arrayPtr = static_cast<hkArray<hkInt32>*>( ptrAddr ); (*arrayPtr)[arrayIndex] = static_cast<hkInt32>(newValue); } break; default: break; } } break; default: break; } return memberPath; }