void FCDEffectPassState::SetDefaultValue() { #define SET_VALUE(offset, valueType, actualValue) *((valueType*)(data + offset)) = actualValue; #define SET_ENUM(offset, nameSpace, actualValue) *((uint32*)(data + offset)) = nameSpace::actualValue; switch ((uint32) type) { case FUDaePassState::ALPHA_FUNC: SET_ENUM(0, FUDaePassStateFunction, ALWAYS); SET_VALUE(4, float, 0.0f); break; case FUDaePassState::BLEND_FUNC: SET_ENUM(0, FUDaePassStateBlendType, ONE); SET_ENUM(4, FUDaePassStateBlendType, ZERO); break; case FUDaePassState::BLEND_FUNC_SEPARATE: SET_ENUM(0, FUDaePassStateBlendType, ONE); SET_ENUM(4, FUDaePassStateBlendType, ZERO); SET_ENUM(8, FUDaePassStateBlendType, ONE); SET_ENUM(12, FUDaePassStateBlendType, ZERO); break; case FUDaePassState::BLEND_EQUATION: SET_ENUM(0, FUDaePassStateBlendEquation, ADD); break; case FUDaePassState::BLEND_EQUATION_SEPARATE: SET_ENUM(0, FUDaePassStateBlendEquation, ADD); SET_ENUM(4, FUDaePassStateBlendEquation, ADD); break; case FUDaePassState::COLOR_MATERIAL: SET_ENUM(0, FUDaePassStateFaceType, FRONT_AND_BACK); SET_ENUM(4, FUDaePassStateMaterialType, AMBIENT_AND_DIFFUSE); break; case FUDaePassState::CULL_FACE: SET_ENUM(0, FUDaePassStateFaceType, BACK); break; case FUDaePassState::DEPTH_FUNC: SET_ENUM(0, FUDaePassStateFunction, ALWAYS); break; case FUDaePassState::FOG_MODE: SET_ENUM(0, FUDaePassStateFogType, EXP); break; case FUDaePassState::FOG_COORD_SRC: SET_ENUM(0, FUDaePassStateFogCoordinateType, FOG_COORDINATE); break; case FUDaePassState::FRONT_FACE: SET_ENUM(0, FUDaePassStateFrontFaceType, COUNTER_CLOCKWISE); break; case FUDaePassState::LIGHT_MODEL_COLOR_CONTROL: SET_ENUM(0, FUDaePassStateLightModelColorControlType, SINGLE_COLOR); break; case FUDaePassState::LOGIC_OP: SET_ENUM(0, FUDaePassStateLogicOperation, COPY); break; case FUDaePassState::POLYGON_MODE: SET_ENUM(0, FUDaePassStateFaceType, FRONT_AND_BACK); SET_ENUM(4, FUDaePassStatePolygonMode, FILL); break; case FUDaePassState::SHADE_MODEL: SET_ENUM(0, FUDaePassStateShadeModel, SMOOTH); break; case FUDaePassState::STENCIL_FUNC: SET_ENUM(0, FUDaePassStateFunction, ALWAYS); SET_VALUE(4, uint8, 0); SET_VALUE(5, uint8, 0xFF); break; case FUDaePassState::STENCIL_OP: SET_ENUM(0, FUDaePassStateStencilOperation, KEEP); SET_ENUM(4, FUDaePassStateStencilOperation, KEEP); SET_ENUM(8, FUDaePassStateStencilOperation, KEEP); break; case FUDaePassState::STENCIL_FUNC_SEPARATE: SET_ENUM(0, FUDaePassStateFunction, ALWAYS); SET_ENUM(4, FUDaePassStateFunction, ALWAYS); SET_VALUE(8, uint8, 0); SET_VALUE(9, uint8, 0xFF); break; case FUDaePassState::STENCIL_OP_SEPARATE: SET_ENUM(0, FUDaePassStateFaceType, FRONT_AND_BACK); SET_ENUM(4, FUDaePassStateStencilOperation, KEEP); SET_ENUM(8, FUDaePassStateStencilOperation, KEEP); SET_ENUM(12, FUDaePassStateStencilOperation, KEEP); break; case FUDaePassState::STENCIL_MASK_SEPARATE: SET_ENUM(0, FUDaePassStateFaceType, FRONT_AND_BACK); SET_VALUE(4, uint8, 0xFF); break; case FUDaePassState::LIGHT_ENABLE: SET_VALUE(0, uint8, 0); SET_VALUE(1, bool, false); break; case FUDaePassState::LIGHT_AMBIENT: SET_VALUE(0, uint8, 0); SET_VALUE(1, FMVector4, FMVector4(0,0,0,1)); break; case FUDaePassState::LIGHT_DIFFUSE: case FUDaePassState::LIGHT_SPECULAR: case FUDaePassState::TEXTURE_ENV_COLOR: case FUDaePassState::CLIP_PLANE: SET_VALUE(0, uint8, 0); SET_VALUE(1, FMVector4, FMVector4::Zero); break; case FUDaePassState::LIGHT_POSITION: SET_VALUE(0, uint8, 0); SET_VALUE(1, FMVector4, FMVector4(0,0,1,0)); break; case FUDaePassState::LIGHT_CONSTANT_ATTENUATION: SET_VALUE(0, uint8, 0); SET_VALUE(1, float, 1.0f); break; case FUDaePassState::LIGHT_LINEAR_ATTENUATION: SET_VALUE(0, uint8, 0); SET_VALUE(1, float, 0.0f); break; case FUDaePassState::LIGHT_QUADRATIC_ATTENUATION: SET_VALUE(0, uint8, 0); SET_VALUE(1, float, 0.0f); break; case FUDaePassState::LIGHT_SPOT_CUTOFF: SET_VALUE(0, uint8, 0); SET_VALUE(1, float, 180.0f); break; case FUDaePassState::LIGHT_SPOT_DIRECTION: SET_VALUE(0, uint8, 0); SET_VALUE(1, FMVector3, FMVector3(0,0,-1)); break; case FUDaePassState::LIGHT_SPOT_EXPONENT: SET_VALUE(0, uint8, 0); SET_VALUE(1, float, 0.0f); break; case FUDaePassState::TEXTURE1D: case FUDaePassState::TEXTURE2D: case FUDaePassState::TEXTURE3D: case FUDaePassState::TEXTURECUBE: case FUDaePassState::TEXTURERECT: case FUDaePassState::TEXTUREDEPTH: SET_VALUE(0, uint8, 0); SET_VALUE(1, uint32, 0); break; case FUDaePassState::TEXTURE1D_ENABLE: case FUDaePassState::TEXTURE2D_ENABLE: case FUDaePassState::TEXTURE3D_ENABLE: case FUDaePassState::TEXTURECUBE_ENABLE: case FUDaePassState::TEXTURERECT_ENABLE: case FUDaePassState::TEXTUREDEPTH_ENABLE: case FUDaePassState::CLIP_PLANE_ENABLE: SET_VALUE(0, uint8, 0); SET_VALUE(1, bool, false); break; case FUDaePassState::TEXTURE_ENV_MODE: memset(data, 0, dataSize); break; case FUDaePassState::BLEND_COLOR: case FUDaePassState::CLEAR_COLOR: case FUDaePassState::FOG_COLOR: case FUDaePassState::SCISSOR: SET_VALUE(0, FMVector4, FMVector4::Zero); break; case FUDaePassState::LIGHT_MODEL_AMBIENT: case FUDaePassState::MATERIAL_AMBIENT: SET_VALUE(0, FMVector4, FMVector4(0.2f,0.2f,0.2f,1.0f)); break; case FUDaePassState::MATERIAL_DIFFUSE: SET_VALUE(0, FMVector4, FMVector4(0.8f,0.8f,0.8f,1.0f)); break; case FUDaePassState::MATERIAL_EMISSION: case FUDaePassState::MATERIAL_SPECULAR: SET_VALUE(0, FMVector4, FMVector4(0,0,0,1)); break; case FUDaePassState::POINT_DISTANCE_ATTENUATION: SET_VALUE(0, FMVector3, FMVector3(1,0,0)); break; case FUDaePassState::DEPTH_BOUNDS: case FUDaePassState::DEPTH_RANGE: SET_VALUE(0, FMVector2, FMVector2(0,1)); break; case FUDaePassState::POLYGON_OFFSET: SET_VALUE(0, FMVector2, FMVector2(0,0)); break; case FUDaePassState::DEPTH_MASK: SET_VALUE(0, bool, true); break; case FUDaePassState::CLEAR_STENCIL: SET_VALUE(0, uint32, 0); break; case FUDaePassState::STENCIL_MASK: SET_VALUE(0, uint32, 0xFFFFFFFF); break; case FUDaePassState::CLEAR_DEPTH: case FUDaePassState::FOG_DENSITY: case FUDaePassState::FOG_END: case FUDaePassState::LINE_WIDTH: case FUDaePassState::POINT_FADE_THRESHOLD_SIZE: case FUDaePassState::POINT_SIZE: case FUDaePassState::POINT_SIZE_MAX: SET_VALUE(0, float, 1.0f); break; case FUDaePassState::FOG_START: case FUDaePassState::MATERIAL_SHININESS: case FUDaePassState::POINT_SIZE_MIN: SET_VALUE(0, float, 0.0f); break; case FUDaePassState::COLOR_MASK: SET_VALUE(0, bool, true); SET_VALUE(1, bool, true); SET_VALUE(2, bool, true); SET_VALUE(3, bool, true); break; case FUDaePassState::LINE_STIPPLE: SET_VALUE(0, uint16, 1); SET_VALUE(2, uint16, 0xFF); break; case FUDaePassState::MODEL_VIEW_MATRIX: case FUDaePassState::PROJECTION_MATRIX: SET_VALUE(0, FMMatrix44, FMMatrix44::Identity); break; case FUDaePassState::LIGHTING_ENABLE: case FUDaePassState::ALPHA_TEST_ENABLE: case FUDaePassState::AUTO_NORMAL_ENABLE: case FUDaePassState::BLEND_ENABLE: case FUDaePassState::COLOR_LOGIC_OP_ENABLE: case FUDaePassState::CULL_FACE_ENABLE: case FUDaePassState::DEPTH_BOUNDS_ENABLE: case FUDaePassState::DEPTH_CLAMP_ENABLE: case FUDaePassState::DEPTH_TEST_ENABLE: case FUDaePassState::DITHER_ENABLE: case FUDaePassState::FOG_ENABLE: case FUDaePassState::LIGHT_MODEL_LOCAL_VIEWER_ENABLE: case FUDaePassState::LIGHT_MODEL_TWO_SIDE_ENABLE: case FUDaePassState::LINE_SMOOTH_ENABLE: case FUDaePassState::LINE_STIPPLE_ENABLE: case FUDaePassState::LOGIC_OP_ENABLE: case FUDaePassState::MULTISAMPLE_ENABLE: case FUDaePassState::NORMALIZE_ENABLE: case FUDaePassState::POINT_SMOOTH_ENABLE: case FUDaePassState::POLYGON_OFFSET_FILL_ENABLE: case FUDaePassState::POLYGON_OFFSET_LINE_ENABLE: case FUDaePassState::POLYGON_OFFSET_POINT_ENABLE: case FUDaePassState::POLYGON_SMOOTH_ENABLE: case FUDaePassState::POLYGON_STIPPLE_ENABLE: case FUDaePassState::RESCALE_NORMAL_ENABLE: case FUDaePassState::SAMPLE_ALPHA_TO_COVERAGE_ENABLE: case FUDaePassState::SAMPLE_ALPHA_TO_ONE_ENABLE: case FUDaePassState::SAMPLE_COVERAGE_ENABLE: case FUDaePassState::SCISSOR_TEST_ENABLE: case FUDaePassState::STENCIL_TEST_ENABLE: SET_VALUE(0, bool, false); break; case FUDaePassState::COLOR_MATERIAL_ENABLE: SET_VALUE(0, bool, true); break; case FUDaePassState::COUNT: case FUDaePassState::INVALID: default: FUFail(break); } #undef SET_ENUM #undef SET_VALUE }
const FMMatrix44List& values = FCDSceneNodeTools::GetSampledAnimationMatrices(); FailIf(keys.size() > 30); PassIf(keys.size() == values.size()); FCDSceneNodeTools::ClearSampledAnimation(); TESTSUITE_TEST(1, CurveMerging) // Test the merge of single curves into multiple curves. FUObjectRef<FCDocument> document = FCollada::NewTopDocument(); FCDAnimation* animation = document->GetAnimationLibrary()->AddEntity(); FCDAnimationChannel* channel = animation->AddChannel(); // Create a first curve. static const size_t curve1KeyCount = 3; static const float curve1Keys[curve1KeyCount] = { 0.0f, 2.0f, 3.0f }; static const float curve1Values[curve1KeyCount] = { 0.0f, -2.0f, 0.0f }; static const FMVector2 curve1Intan[curve1KeyCount] = { FMVector2(-0.3f, 0.0f), FMVector2(1.2f, 1.0f), FMVector2(2.8f, -1.0f) }; static const FMVector2 curve1Outtan[curve1KeyCount] = { FMVector2(0.5f, -4.0f), FMVector2(2.5f, 3.0f), FMVector2(3.0f, 0.0f) }; FCDAnimationCurve* c1 = channel->AddCurve(); for (size_t i = 0; i < curve1KeyCount; ++i) { FCDAnimationKeyBezier* k = (FCDAnimationKeyBezier*) c1->AddKey(FUDaeInterpolation::BEZIER); k->input = curve1Keys[i]; k->output = curve1Values[i]; k->inTangent = curve1Intan[i]; k->outTangent = curve1Outtan[i]; } // Create a second curve. static const size_t curve2KeyCount = 3; static const float curve2Keys[curve2KeyCount] = { 0.0f, 1.0f, 3.0f }; static const float curve2Values[curve2KeyCount] = { -10.0f, -12.0f, -10.0f }; static const FMVector2 curve2Intan[curve2KeyCount] = { FMVector2(0.0f, 0.0f), FMVector2(0.8f, -2.0f), FMVector2(2.7f, -2.0f) }; static const FMVector2 curve2Outtan[curve2KeyCount] = { FMVector2(0.2f, 0.0f), FMVector2(1.8f, -1.0f), FMVector2(3.5f, 2.0f) };
uint32 ReadSourceInterleaved(xmlNode* sourceNode, fm::pvector<FMVector2List>& arrays) { uint32 stride = 1; if (sourceNode != NULL) { // Get the accessor's count xmlNode* accessorNode = FindTechniqueAccessor(sourceNode); uint32 count = ReadNodeCount(accessorNode); for (fm::pvector<FMVector2List>::iterator it = arrays.begin(); it != arrays.end(); ++it) { (*it)->resize(count); } // Backward Compatibility: if the stride is exactly half the expected value, // then we have the old 1D tangents that we need to parse correctly. stride = ReadNodeStride(accessorNode); if (stride > 0 && stride == arrays.size()) { // Read and parse the float array xmlNode* arrayNode = FindChildByType(sourceNode, DAE_FLOAT_ARRAY_ELEMENT); const char* value = ReadNodeContentDirect(arrayNode); for (size_t i = 0; i < count && *value != 0; ++i) { for (size_t j = 0; j < stride && *value != 0; ++j) { arrays[j]->at(i) = FMVector2(FUStringConversion::ToFloat(&value), 0.0f); } } while (*value != 0) { for (size_t i = 0; i < stride && *value != 0; ++i) { arrays[i]->push_back(FMVector2(FUStringConversion::ToFloat(&value), 0.0f)); } } } else { // Use the stride to pad the interleaved float lists or remove extra elements while (stride < arrays.size() * 2) arrays.pop_back(); while (stride > arrays.size() * 2) arrays.push_back(NULL); // Read and parse the float array xmlNode* arrayNode = FindChildByType(sourceNode, DAE_FLOAT_ARRAY_ELEMENT); const char* value = ReadNodeContentDirect(arrayNode); for (size_t i = 0; i < count && *value != 0; ++i) { for (size_t j = 0; 2 * j < stride && *value != 0; ++j) { if (arrays[j] != NULL) { arrays[j]->at(i).u = FUStringConversion::ToFloat(&value); arrays[j]->at(i).v = FUStringConversion::ToFloat(&value); } else { FUStringConversion::ToFloat(&value); FUStringConversion::ToFloat(&value); } } } while (*value != 0) { for (size_t i = 0; 2 * i < stride && *value != 0; ++i) { if (arrays[i] != NULL) { FMVector2 v; v.u = FUStringConversion::ToFloat(&value); v.v = FUStringConversion::ToFloat(&value); arrays[i]->push_back(v); } else { FUStringConversion::ToFloat(&value); FUStringConversion::ToFloat(&value); } } } } } return stride; }