Example #1
0
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
}
Example #2
0
	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) };
Example #3
0
	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;
	}