Describes the NxParameterized::Interface for 'ClothingActorParam' : More...
#include <params.h>
Public Attributes | |
Mat44 | globalPose |
'globalPose' : The pose where the clothing asset will be put into the scene | |
Bool | useHardwareCloth |
'useHardwareCloth' : Turns on hardware acceleration for the cloth simulation | |
Bool | flags.ParallelCpuSkinning |
'flags.ParallelCpuSkinning' : Determines whether or not to perform CPU skinning in parallel | |
Bool | flags.RecomputeNormals |
'flags.RecomputeNormals' : Fully recomputes the normals on the final mesh. | |
Bool | flags.RecomputeTangents |
'flags.RecomputeTangents' : Fully recomputes the tangents on the final mesh. | |
Bool | flags.Visualize |
'flags.Visualize' : Determines whether or not to display debug visualization for this clothing actor | |
Bool | flags.CorrectSimulationNormals |
'flags.CorrectSimulationNormals' : | |
Bool | flags.ComputeRenderData |
'flags.ComputeRenderData' : If set to false no skinning is done for this actor. Disable if all skinning is done outside of APEX. | |
Bool | flags.ComputePhysicsMeshNormals |
'flags.ComputePhysicsMeshNormals' : If set to false the normals on the physics mesh are not computed. Disable skinning and normal calculation is done outside of APEX. | |
Bool | fallbackSkinning |
'fallbackSkinning' : Performs skinning in software | |
Bool | slowStart |
'slowStart' : Prevents from having full max distance right from the start | |
Bool | useInternalBoneOrder |
'useInternalBoneOrder' : Expect internally ordered bone arrays in updateState call. | |
Bool | updateStateWithGlobalMatrices |
'updateStateWithGlobalMatrices' : Use world space matrices instead of composite (relative to bind pose) in NxClothingActor::updateState(). | |
U32 | uvChannelForTangentUpdate |
'uvChannelForTangentUpdate' : This UV channel is used for updating tangent space | |
F32 | maxDistanceBlendTime |
'maxDistanceBlendTime' : Time in seconds how long it takes to go from zero maxDistance to full maxDistance | |
U32 | clothingMaterialIndex |
'clothingMaterialIndex' : Use this material from the assets material library | |
F32 | lodWeights.maxDistance |
'lodWeights.maxDistance' : Maximum distance | |
F32 | lodWeights.distanceWeight |
'lodWeights.distanceWeight' : Distance weight | |
F32 | lodWeights.bias |
'lodWeights.bias' : Bias | |
F32 | lodWeights.benefitsBias |
'lodWeights.benefitsBias' : Benefits bias | |
Vec3 | windParams.Velocity |
'windParams.Velocity' : The target velocity each vertex tries to achieve. | |
F32 | windParams.Adaption |
'windParams.Adaption' : The rate of adaption. The higher this value, the faster the cloth reaches the wind velocity. Set to 0 to turn off wind. | |
F32 | maxDistanceScale.Scale |
'maxDistanceScale.Scale' : Scale | |
Bool | maxDistanceScale.Multipliable |
'maxDistanceScale.Multipliable' : Multipliable | |
U64 | userData |
'userData' : Optional user data pointer associated with the clothing actor | |
Mat44 | boneMatrices[] |
'boneMatrices[]' : An Array of matrices with the full transform for each bone | |
F32 | clothDescTemplate.collisionResponseCoefficient |
'clothDescTemplate.collisionResponseCoefficient' : Defines a factor for the impulse transfer from cloth to colliding rigid bodies. | |
U16 | clothDescTemplate.collisionGroup |
'clothDescTemplate.collisionGroup' : Sets which collision group this cloth is part of. | |
U32 | clothDescTemplate.groupsMask.bits0 |
'clothDescTemplate.groupsMask.bits0' : First part of 128-bit group mask | |
U32 | clothDescTemplate.groupsMask.bits1 |
'clothDescTemplate.groupsMask.bits1' : Second part of 128-bit group mask | |
U32 | clothDescTemplate.groupsMask.bits2 |
'clothDescTemplate.groupsMask.bits2' : Third part of 128-bit group mask | |
U32 | clothDescTemplate.groupsMask.bits3 |
'clothDescTemplate.groupsMask.bits3' : Fourth part of 128-bit group mask | |
Bounds3 | clothDescTemplate.validBounds |
'clothDescTemplate.validBounds' : Defines the volume outside of which cloth particle are automatically removed from the simulation. | |
U64 | clothDescTemplate.compartment |
'clothDescTemplate.compartment' : The compartment to place the cloth in. | |
U64 | clothDescTemplate.userData |
'clothDescTemplate.userData' : Optional user data pointer. | |
Bool | shapeDescTemplate.flags.NX_SF_VISUALIZATION |
'shapeDescTemplate.flags.NX_SF_VISUALIZATION' : Enable debug renderer for this shape | |
Bool | shapeDescTemplate.flags.NX_SF_DISABLE_COLLISION |
'shapeDescTemplate.flags.NX_SF_DISABLE_COLLISION' : Disable collision detection for this shape (counterpart of NX_AF_DISABLE_COLLISION) | |
Bool | shapeDescTemplate.flags.NX_SF_DISABLE_RAYCASTING |
'shapeDescTemplate.flags.NX_SF_DISABLE_RAYCASTING' : Disable raycasting for this shape | |
Bool | shapeDescTemplate.flags.NX_SF_DYNAMIC_DYNAMIC_CCD |
'shapeDescTemplate.flags.NX_SF_DYNAMIC_DYNAMIC_CCD' : Enable dynamic-dynamic CCD for this shape. Used only when CCD is globally enabled and shape have a CCD skeleton. | |
Bool | shapeDescTemplate.flags.NX_SF_DISABLE_SCENE_QUERIES |
'shapeDescTemplate.flags.NX_SF_DISABLE_SCENE_QUERIES' : Disable participation in ray casts, overlap tests and sweeps. | |
U16 | shapeDescTemplate.collisionGroup |
'shapeDescTemplate.collisionGroup' : Sets which collision group this shape is part of. | |
U32 | shapeDescTemplate.groupsMask.bits0 |
'shapeDescTemplate.groupsMask.bits0' : First part of 128-bit group mask | |
U32 | shapeDescTemplate.groupsMask.bits1 |
'shapeDescTemplate.groupsMask.bits1' : Second part of 128-bit group mask | |
U32 | shapeDescTemplate.groupsMask.bits2 |
'shapeDescTemplate.groupsMask.bits2' : Third part of 128-bit group mask | |
U32 | shapeDescTemplate.groupsMask.bits3 |
'shapeDescTemplate.groupsMask.bits3' : Fourth part of 128-bit group mask | |
U16 | shapeDescTemplate.materialIndex |
'shapeDescTemplate.materialIndex' : The material index of the shape. | |
U64 | shapeDescTemplate.userData |
'shapeDescTemplate.userData' : Optional user data pointer | |
U64 | shapeDescTemplate.name |
'shapeDescTemplate.name' : Name of the shapes; must be set by the application and must be a persistent pointer. | |
U64 | actorDescTemplate.userData |
'actorDescTemplate.userData' : Optional user data pointer | |
U64 | actorDescTemplate.name |
'actorDescTemplate.name' : Optional name string for the shape; must be set by the application and must be a persistent pointer. | |
F32 | actorScale |
'actorScale' : Scale the actor differently than the asset. | |
ClothingCookedParam | runtimeCooked |
'runtimeCooked' : | |
Vec3 | morphDisplacements[] |
'morphDisplacements[]' : Displacements according to the current morph target. | |
Vec3 | morphPhysicalMeshNewPositions[] |
'morphPhysicalMeshNewPositions[]' : New positions for the physical meshes and convex collision volumes. | |
Vec3 | morphGraphicalMeshNewPositions[] |
'morphGraphicalMeshNewPositions[]' : New positions of all submeshes of all graphical meshes. | |
Bool | allowAdaptiveTargetFrequency |
'allowAdaptiveTargetFrequency' : Slightly modifies gravity to avoid high frequency jittering due to variable time steps. | |
Bool | useVelocityClamping |
'useVelocityClamping' : Enable/disable velocity clamping | |
Bounds3 | vertexVelocityClamp |
'vertexVelocityClamp' : Vertex velocity clamping values | |
F32 | pressure |
'pressure' : Set pressure of cloth, only works on closed meshes. | |
Bool | multiplyGlobalPoseIntoBones |
'multiplyGlobalPoseIntoBones' : Enable/disable multiplying global pose into bones | |
String | overrideMaterialNames[] |
'overrideMaterialNames[]' : Replacement material names for the ones provided by the render mesh asset inside the clothing asset. | |
SimulationBackend | simulationBackend |
'simulationBackend' : Select which backend should be used. 'ForceNative' will only work when running with the 2.8.x PhysX SDK | |
Bool | freezeByLOD |
'freezeByLOD' : Cloth state frozen when LoD turns off simulation of the actor, instead of returning to the animated state. | |
Bool | localSpaceSim |
'localSpaceSim' : Do simulation in local space. | |
I32 | teleportMode |
'teleportMode' : Buffered teleport state for the next simulate call, gets set in updateState, is reset to Continuous during simulate(). |
Detailed Description
Describes the NxParameterized::Interface for 'ClothingActorParam' :
ClothingActorParam contains 90 fully qualified names --------------------------------------------- 1 : Mat44 globalPose 2 : Bool useHardwareCloth 3 : Bool flags.ParallelCpuSkinning 4 : Bool flags.RecomputeNormals 5 : Bool flags.RecomputeTangents 6 : Bool flags.Visualize 7 : Bool flags.CorrectSimulationNormals 8 : Bool flags.ComputeRenderData 9 : Bool flags.ComputePhysicsMeshNormals 10 : Bool fallbackSkinning 11 : Bool slowStart 12 : Bool useInternalBoneOrder 13 : Bool updateStateWithGlobalMatrices 14 : U32 uvChannelForTangentUpdate 15 : F32 maxDistanceBlendTime 16 : U32 clothingMaterialIndex 17 : F32 lodWeights.maxDistance 18 : F32 lodWeights.distanceWeight 19 : F32 lodWeights.bias 20 : F32 lodWeights.benefitsBias 21 : Vec3 windParams.Velocity 22 : F32 windParams.Adaption 23 : F32 maxDistanceScale.Scale 24 : Bool maxDistanceScale.Multipliable 25 : U64 userData 26 : ArraySizeName boneMatrices 27 : Mat44 boneMatrices[] 28 : F32 clothDescTemplate.collisionResponseCoefficient 29 : U16 clothDescTemplate.collisionGroup 30 : U32 clothDescTemplate.groupsMask.bits0 31 : U32 clothDescTemplate.groupsMask.bits1 32 : U32 clothDescTemplate.groupsMask.bits2 33 : U32 clothDescTemplate.groupsMask.bits3 34 : Bounds3 clothDescTemplate.validBounds 35 : U64 clothDescTemplate.compartment 36 : U64 clothDescTemplate.userData 37 : Bool shapeDescTemplate.flags.NX_SF_VISUALIZATION 38 : Bool shapeDescTemplate.flags.NX_SF_DISABLE_COLLISION 39 : Bool shapeDescTemplate.flags.NX_SF_DISABLE_RAYCASTING 40 : Bool shapeDescTemplate.flags.NX_SF_DYNAMIC_DYNAMIC_CCD 41 : Bool shapeDescTemplate.flags.NX_SF_DISABLE_SCENE_QUERIES 42 : U16 shapeDescTemplate.collisionGroup 43 : U32 shapeDescTemplate.groupsMask.bits0 44 : U32 shapeDescTemplate.groupsMask.bits1 45 : U32 shapeDescTemplate.groupsMask.bits2 46 : U32 shapeDescTemplate.groupsMask.bits3 47 : U16 shapeDescTemplate.materialIndex 48 : U64 shapeDescTemplate.userData 49 : U64 shapeDescTemplate.name 50 : U64 actorDescTemplate.userData 51 : U64 actorDescTemplate.name 52 : F32 actorScale 53 : F32 runtimeCooked.actorScale RefVariant[ClothingCookedParam] 54 : ArraySizeName runtimeCooked.convexCookedData RefVariant[ClothingCookedParam] 55 : U8 runtimeCooked.convexCookedData[] RefVariant[ClothingCookedParam] 56 : ArraySizeName runtimeCooked.convexMeshPointers RefVariant[ClothingCookedParam] 57 : ArraySizeName runtimeCooked.cookedPhysicalSubmeshes RefVariant[ClothingCookedParam] 58 : U32 runtimeCooked.cookedPhysicalSubmeshes[].physicalMeshId RefVariant[ClothingCookedParam] 59 : U32 runtimeCooked.cookedPhysicalSubmeshes[].submeshId RefVariant[ClothingCookedParam] 60 : U32 runtimeCooked.cookedPhysicalSubmeshes[].cookedDataOffset RefVariant[ClothingCookedParam] 61 : U32 runtimeCooked.cookedPhysicalSubmeshes[].cookedDataLength RefVariant[ClothingCookedParam] 62 : U32 runtimeCooked.cookedPhysicalSubmeshes[].deformableInvParticleWeightsOffset RefVariant[ClothingCookedParam] 63 : U32 runtimeCooked.cookedPhysicalSubmeshes[].virtualParticleIndicesOffset RefVariant[ClothingCookedParam] 64 : U32 runtimeCooked.cookedPhysicalSubmeshes[].virtualParticleIndicesLength RefVariant[ClothingCookedParam] 65 : ArraySizeName runtimeCooked.deformableCookedData RefVariant[ClothingCookedParam] 66 : U8 runtimeCooked.deformableCookedData[] RefVariant[ClothingCookedParam] 67 : U32 runtimeCooked.cookedDataVersion RefVariant[ClothingCookedParam] 68 : ArraySizeName runtimeCooked.deformableInvParticleWeights RefVariant[ClothingCookedParam] 69 : F32 runtimeCooked.deformableInvParticleWeights[] RefVariant[ClothingCookedParam] 70 : ArraySizeName runtimeCooked.virtualParticleIndices RefVariant[ClothingCookedParam] 71 : U32 runtimeCooked.virtualParticleIndices[] RefVariant[ClothingCookedParam] 72 : ArraySizeName runtimeCooked.virtualParticleWeights RefVariant[ClothingCookedParam] 73 : Vec3 runtimeCooked.virtualParticleWeights[] RefVariant[ClothingCookedParam] 74 : ArraySizeName morphDisplacements 75 : Vec3 morphDisplacements[] 76 : ArraySizeName morphPhysicalMeshNewPositions 77 : Vec3 morphPhysicalMeshNewPositions[] 78 : ArraySizeName morphGraphicalMeshNewPositions 79 : Vec3 morphGraphicalMeshNewPositions[] 80 : Bool allowAdaptiveTargetFrequency 81 : Bool useVelocityClamping 82 : Bounds3 vertexVelocityClamp 83 : F32 pressure 84 : Bool multiplyGlobalPoseIntoBones 85 : ArraySizeName overrideMaterialNames 86 : String overrideMaterialNames[] 87 : SimulationBackend simulationBackend 88 : Bool freezeByLOD 89 : Bool localSpaceSim 90 : I32 teleportMode
Member Data Documentation
'actorDescTemplate.name' : Optional name string for the shape; must be set by the application and must be a persistent pointer.
'actorDescTemplate.userData' : Optional user data pointer
'actorScale' : Scale the actor differently than the asset.
'allowAdaptiveTargetFrequency' : Slightly modifies gravity to avoid high frequency jittering due to variable time steps.
'boneMatrices[]' : An Array of matrices with the full transform for each bone
These matrices are sometimes referred to as composite matrices. They are the multiplication of the current world space bone pose with the inverse bind pose in world space. Note: If 'updateStateWithGlobalMatrices' is set to true, these must be global poses instead.
'clothDescTemplate.collisionGroup' : Sets which collision group this cloth is part of.
'clothDescTemplate.collisionResponseCoefficient' : Defines a factor for the impulse transfer from cloth to colliding rigid bodies.
This is only needed if the twoway interaction flag is set in the clothing asset.
'clothDescTemplate.compartment' : The compartment to place the cloth in.
Must be either a pointer to an NxCompartment of type NX_SCT_CLOTH or NX_SCT_SOFTBODY, or NULL. A NULL compartment means creating NX_CLF_HARDWARE cloth in the first available cloth compartment (a default cloth compartment is created if none exists). Software cloth with a NULL compartment is created in the scene proper.
'clothDescTemplate.groupsMask.bits0' : First part of 128-bit group mask
'clothDescTemplate.groupsMask.bits1' : Second part of 128-bit group mask
'clothDescTemplate.groupsMask.bits2' : Third part of 128-bit group mask
'clothDescTemplate.groupsMask.bits3' : Fourth part of 128-bit group mask
'clothDescTemplate.userData' : Optional user data pointer.
'clothDescTemplate.validBounds' : Defines the volume outside of which cloth particle are automatically removed from the simulation.
Only works if the flag NX_CLF_VALIDBOUNDS is set.
'clothingMaterialIndex' : Use this material from the assets material library
'fallbackSkinning' : Performs skinning in software
Performs the regular boneweighted skinning on the CPU before giving the data out through the rendering API.
'flags.ComputePhysicsMeshNormals' : If set to false the normals on the physics mesh are not computed. Disable skinning and normal calculation is done outside of APEX.
'flags.ComputeRenderData' : If set to false no skinning is done for this actor. Disable if all skinning is done outside of APEX.
'flags.CorrectSimulationNormals' :
The MaxDistance=0 vertices can have a perturbed simulation normal. This usually happens only for meshes where the MaxDistance=0 vertices are somewhere in the middle separating a simulated and non-simulated region. The normal for those vertices will be computed only by the simulated triangles which can lead to wrong results. This solution will use the normals from the original simulation mesh and skin them with respect to the local pose.
'flags.ParallelCpuSkinning' : Determines whether or not to perform CPU skinning in parallel
All graphical vertices without correspondence to physical vertices or triangles are skinned normally. This flag specifies whether this happens during Physics scene simulation, or after. Note: If this flag is set, an inconsistency can arise when calling NxClothingActor::updateRenderResource in between NxApexScene::simulate and NxApexScene::fetchResults. As a workaround, you should only call NxClothingActor::updateRenderResources _after_ NxApexScene::fetchResults has terminated.
'flags.RecomputeNormals' : Fully recomputes the normals on the final mesh.
This usually leads to better looking results, but is more expensive to compute. Default is off.
'flags.RecomputeTangents' : Fully recomputes the tangents on the final mesh.
RecomputeTangents can only be set to false if less than half of the graphics mesh vertices have an exact match in the physics mesh. Otherwise it's always on.
'flags.Visualize' : Determines whether or not to display debug visualization for this clothing actor
'freezeByLOD' : Cloth state frozen when LoD turns off simulation of the actor, instead of returning to the animated state.
'globalPose' : The pose where the clothing asset will be put into the scene
'localSpaceSim' : Do simulation in local space.
If this flag is enabled the simulation is done at origin, however the cloth is rendered at its global position. The simulation of the actor is transformed such that the root bone ends up at origin. The scale of the actor is maintained during the simulation. If a 3.x physX simulation backend is used, it is possible to add the inertia effects to the simulation, through the inertiaScale parameter of the clothing material. So with an inertiaScale of 1.0 there should be no visible difference between local space and global space simulation. Known issues: - PhysX 2.8.4 does not support inertiaScale (it corresponds to inertiaScale=0.0f). So if localSpaceSim is enabled there's no inertia effect when the global pose of the clothing actor changes. - With 2.8.4 this only works for clothing on 1 character, without world collision. This is because collision volumes would interfere with the cloth that is simulated at origin. This is not a problem in 3.x because there collision only happens with the collision volumes specifically defined for the clothing actor.
'lodWeights.benefitsBias' : Benefits bias
'lodWeights.bias' : Bias
'lodWeights.distanceWeight' : Distance weight
'lodWeights.maxDistance' : Maximum distance
'maxDistanceBlendTime' : Time in seconds how long it takes to go from zero maxDistance to full maxDistance
Note: This also influences how quickly different physical LoDs can be switched
'maxDistanceScale.Multipliable' : Multipliable
'maxDistanceScale.Scale' : Scale
'morphDisplacements[]' : Displacements according to the current morph target.
'morphGraphicalMeshNewPositions[]' : New positions of all submeshes of all graphical meshes.
'morphPhysicalMeshNewPositions[]' : New positions for the physical meshes and convex collision volumes.
'multiplyGlobalPoseIntoBones' : Enable/disable multiplying global pose into bones
'overrideMaterialNames[]' : Replacement material names for the ones provided by the render mesh asset inside the clothing asset.
'pressure' : Set pressure of cloth, only works on closed meshes.
'runtimeCooked' :
'shapeDescTemplate.collisionGroup' : Sets which collision group this shape is part of.
Default group is 0. Maximum possible group is 31. Collision groups are sets of shapes which may or may not be set to collision detect with each other; this can be set using NxScene::setGroupCollisionFlag() Sleeping: Does NOT wake the associated actor up automatically.
'shapeDescTemplate.flags.NX_SF_DISABLE_COLLISION' : Disable collision detection for this shape (counterpart of NX_AF_DISABLE_COLLISION)
'shapeDescTemplate.flags.NX_SF_DISABLE_RAYCASTING' : Disable raycasting for this shape
'shapeDescTemplate.flags.NX_SF_DISABLE_SCENE_QUERIES' : Disable participation in ray casts, overlap tests and sweeps.
Setting this to true will make the non-compartment CPU cloth not work.
'shapeDescTemplate.flags.NX_SF_DYNAMIC_DYNAMIC_CCD' : Enable dynamic-dynamic CCD for this shape. Used only when CCD is globally enabled and shape have a CCD skeleton.
'shapeDescTemplate.flags.NX_SF_VISUALIZATION' : Enable debug renderer for this shape
'shapeDescTemplate.groupsMask.bits0' : First part of 128-bit group mask
'shapeDescTemplate.groupsMask.bits1' : Second part of 128-bit group mask
'shapeDescTemplate.groupsMask.bits2' : Third part of 128-bit group mask
'shapeDescTemplate.groupsMask.bits3' : Fourth part of 128-bit group mask
'shapeDescTemplate.materialIndex' : The material index of the shape.
'shapeDescTemplate.name' : Name of the shapes; must be set by the application and must be a persistent pointer.
'shapeDescTemplate.userData' : Optional user data pointer
'simulationBackend' : Select which backend should be used. 'ForceNative' will only work when running with the 2.8.x PhysX SDK
'slowStart' : Prevents from having full max distance right from the start
The first time a NxClothingActor starts to be simulated is with full max distance. This prevents starting with full max distance and instead blending in as it will do the second time.
'teleportMode' : Buffered teleport state for the next simulate call, gets set in updateState, is reset to Continuous during simulate().
0 = ClothingTeleportMode::Continuous 1 = ClothingTeleportMode::Teleport 2 = ClothingTeleportMode::TeleportAndReset
'updateStateWithGlobalMatrices' : Use world space matrices instead of composite (relative to bind pose) in NxClothingActor::updateState().
Depending on what matrices are present, the state can be updated using global world or object space bone matrices or composite matrices. The composite matrix can be generated by multiplying the world or object space matrix by the inverse bone bine pose. Note: If there are problems which might be caused by bind poses being different in the ClothingAsset and in the game's animation system, changing this to true (and thus providing global pose matrices) might fix the problem.
'useHardwareCloth' : Turns on hardware acceleration for the cloth simulation
'useInternalBoneOrder' : Expect internally ordered bone arrays in updateState call.
If this is set to true the bone buffers in updateState and the actor descriptor have to be given in the same order as the bones are stored internally in the asset. This can be queried using NxClothingAsset::getNumUsedBones and NxClothingAsset::getBoneName or NxClothingAsset::getBoneMapping. If this is set to false, the bone buffers can be provided in the order as they are stored in the application. This is either the bone order at authoring time, or NxClothingAsset::remapBoneIndex can be called for each bone to let APEX know about the current ordering in the game. Note that this is only recommended if the application already uses physx::PxMat44 (or something binary equivalent) and does not have to convert the matrices.
'userData' : Optional user data pointer associated with the clothing actor
'useVelocityClamping' : Enable/disable velocity clamping
'uvChannelForTangentUpdate' : This UV channel is used for updating tangent space
Tangent update is done based on one UV channel. This allows selection of what UV channel is being used.
'vertexVelocityClamp' : Vertex velocity clamping values
'windParams.Adaption' : The rate of adaption. The higher this value, the faster the cloth reaches the wind velocity. Set to 0 to turn off wind.
This is roughly the inverse of the time in seconds it takes to adapt to the wind velocity.
'windParams.Velocity' : The target velocity each vertex tries to achieve.
The documentation for this struct was generated from the following file:
Generated on Fri Dec 15 2017 13:59:11
Copyright © 2012-2017 NVIDIA Corporation, 2701 San Tomas Expressway, Santa Clara, CA 95050 U.S.A. All rights reserved.