示例#1
0
        private void AdjustForCorrectAntipodality(Function vsMain, int index, ref int funcCounter,
                                                  Parameter tempWorldMatrix)
        {
            FunctionInvocation curFuncInvocation = null;

            //Antipodality doesn't need to be adjusted for dq0 on itself (used as the basis of antipodality calculations)
            if (index > 0)
            {
                curFuncInvocation = new FunctionInvocation(SGXFuncAntipodalityAdjustment,
                                                           (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                           funcCounter++);
                //This is the base dual quaternion dq0, which the antipodality calculations are based on
                curFuncInvocation.PushOperand(this.paramInitialDQ, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(this.paramTempFloat2x4, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(tempWorldMatrix, Operand.OpSemantic.Out);
                vsMain.AddAtomInstance(curFuncInvocation);
            }
            else if (index == 0)
            {
                //Set the first dual quaternion as the initial dq
                curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncAssign,
                                                           (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                           funcCounter++);
                curFuncInvocation.PushOperand(this.paramTempFloat2x4, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(this.paramInitialDQ, Operand.OpSemantic.Out);
                vsMain.AddAtomInstance(curFuncInvocation);
            }
        }
示例#2
0
        private bool AddVsInvocations(Function vsMain, int groupOrder)
        {
            FunctionInvocation funcInvocation = null;
            int internalCounter = 0;

            funcInvocation = new FunctionInvocation(SGXFuncInstancedViewportsTransform, groupOrder, internalCounter++);
            funcInvocation.PushOperand(this.vsInPosition, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.worldViewMatrix, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.projectionMatrix, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.vsInViewportOffsetMatrixR0, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.vsInViewportOffsetMatrixR1, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.vsInViewportOffsetMatrixR2, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.vsInViewportOffsetMatrixR3, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.vsInMonitorsCount, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.vsInMonitorIndex, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.vsOriginalOutPositionProjectiveSpace, Operand.OpSemantic.Out);
            vsMain.AddAtomInstance(funcInvocation);

            //Output position in projective space
            funcInvocation = new FunctionInvocation(FFPRenderState.FFPFuncAssign, groupOrder, internalCounter++);
            funcInvocation.PushOperand(this.vsOriginalOutPositionProjectiveSpace, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.vsOutPositionProjectiveSpace, Operand.OpSemantic.Out);
            vsMain.AddAtomInstance(funcInvocation);

            //Output monitor index
            funcInvocation = new FunctionInvocation(FFPRenderState.FFPFuncAssign, groupOrder, internalCounter++);
            funcInvocation.PushOperand(this.vsInMonitorIndex, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.vsOutMonitorIndex, Operand.OpSemantic.Out);
            vsMain.AddAtomInstance(funcInvocation);

            return(true);
        }
示例#3
0
        private void AddIndexedPositionWeight(Function vsMain, int index, Parameter worldMatrix,
                                              Parameter positionTempParameter, Parameter positionRelatedOutputParam,
                                              ref int funcCounter)
        {
            Operand.OpMask     indexMask         = IndexToMask(index);
            FunctionInvocation curFuncInvocation = null;

            //multiply position with world matrix and put into temporary param
            curFuncInvocation = new FunctionInvocation(SGXFuncBlendWeight,
                                                       (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                       funcCounter++);
            curFuncInvocation.PushOperand(paramInWeights, Operand.OpSemantic.In, indexMask);
            curFuncInvocation.PushOperand(worldMatrix, Operand.OpSemantic.In);
            curFuncInvocation.PushOperand(positionTempParameter, Operand.OpSemantic.Out);
            vsMain.AddAtomInstance(curFuncInvocation);

            //check if on first iteration
            if (index == 0)
            {
                //set the local param as the value of the world param
                curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncAssign,
                                                           (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                           funcCounter++);
                curFuncInvocation.PushOperand(positionTempParameter, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(positionRelatedOutputParam, Operand.OpSemantic.Out);
                vsMain.AddAtomInstance(curFuncInvocation);
            }
            else
            {
                //add the local param as the value of the world param
                curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncAdd,
                                                           (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                           funcCounter++);
                curFuncInvocation.PushOperand(positionTempParameter, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(positionRelatedOutputParam, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(positionRelatedOutputParam, Operand.OpSemantic.Out);
                vsMain.AddAtomInstance(curFuncInvocation);
            }
        }
示例#4
0
        private bool AddPsInvocations(Function psMain, int groupOrder)
        {
            FunctionInvocation funcInvocation = null;
            int internalCounter = 0;

            funcInvocation = new FunctionInvocation(SGXFuncInstancedViewportsDiscardOutOfBounds, groupOrder, internalCounter++);
            funcInvocation.PushOperand(this.psInMonitorsCount, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.psInMonitorIndex, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.psInPositionProjectiveSpace, Operand.OpSemantic.In);

            psMain.AddAtomInstance(funcInvocation);

            return(true);
        }
示例#5
0
        private bool AddVsInvocations(Function vsMain, int groupOrder)
        {
            FunctionInvocation funcInvocation = null;
            int internalCounter = 0;

            //Output mask texgture coordinates
            funcInvocation = new FunctionInvocation(FFPRenderState.FFPFuncAssign, groupOrder, internalCounter++);
            funcInvocation.PushOperand(this.vsInMaskTexcoord, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.vsOutMaskTexcoord, Operand.OpSemantic.Out);
            vsMain.AddAtomInstance(funcInvocation);

            //Output reflection texture coordinates.
            if (this.reflectionMapType == TextureType.TwoD)
            {
                funcInvocation = new FunctionInvocation(FFPRenderState.FFPFunGenerateTexcoordEnvSphere, groupOrder,
                                                        internalCounter++);
                funcInvocation.PushOperand(this.worldITMatrix, Operand.OpSemantic.In);
                funcInvocation.PushOperand(this.viewMatrix, Operand.OpSemantic.In);
                funcInvocation.PushOperand(this.vsInputNormal, Operand.OpSemantic.In);
                funcInvocation.PushOperand(this.vsOutReflectionTexcoord, Operand.OpSemantic.Out);
                vsMain.AddAtomInstance(funcInvocation);
            }
            else
            {
                funcInvocation = new FunctionInvocation(FFPRenderState.FFPFuncGenerateTexCoordEnvReflect, groupOrder,
                                                        internalCounter++);
                funcInvocation.PushOperand(this.worldMatrix, Operand.OpSemantic.In);
                funcInvocation.PushOperand(this.worldITMatrix, Operand.OpSemantic.In);
                funcInvocation.PushOperand(this.viewMatrix, Operand.OpSemantic.In);
                funcInvocation.PushOperand(this.vsInputNormal, Operand.OpSemantic.In);
                funcInvocation.PushOperand(this.vsInputPos, Operand.OpSemantic.In);
                funcInvocation.PushOperand(this.vsOutReflectionTexcoord, Operand.OpSemantic.Out);
                vsMain.AddAtomInstance(funcInvocation);
            }

            return(true);
        }
示例#6
0
        internal override bool CreateCpuSubPrograms(ProgramSet programSet)
        {
            Program vsProgram = programSet.CpuVertexProgram;

            //Resolve world view proj matrix
            UniformParameter wvpMatrix =
                vsProgram.ResolveAutoParameterInt(Graphics.GpuProgramParameters.AutoConstantType.WorldViewProjMatrix, 0);

            if (wvpMatrix == null)
            {
                return(false);
            }

            Function vsEntry = vsProgram.EntryPointFunction;

            //Resolve input position parameter
            Parameter positionIn = vsEntry.ResolveInputParameter(Parameter.SemanticType.Position, 0,
                                                                 Parameter.ContentType.PositionObjectSpace,
                                                                 Graphics.GpuProgramParameters.GpuConstantType.Float4);

            if (positionIn == null)
            {
                return(false);
            }

            //Resolve output position parameter
            Parameter positionOut = vsEntry.ResolveOutputParameter(Parameter.SemanticType.Position, 0,
                                                                   Parameter.ContentType.PositionProjectiveSpace,
                                                                   Graphics.GpuProgramParameters.GpuConstantType.Float4);

            if (positionOut == null)
            {
                return(false);
            }

            //Add dependency
            vsProgram.AddDependency(FFPRenderState.FFPLibTransform);

            var transformFunc = new FunctionInvocation(FFPRenderState.FFPFuncTransform, -1, 0);

            transformFunc.PushOperand(wvpMatrix, Operand.OpSemantic.In);
            transformFunc.PushOperand(positionIn, Operand.OpSemantic.In);
            transformFunc.PushOperand(positionOut, Operand.OpSemantic.Out);

            vsEntry.AddAtomInstance(transformFunc);

            return(true);
        }
示例#7
0
        private bool AddPsInvocations(Function psMain, int groupOrder)
        {
            FunctionInvocation funcInvocation = null;
            int internalCounter = 0;

            funcInvocation = new FunctionInvocation(SGXFuncApplyReflectionMap, groupOrder, internalCounter++);
            funcInvocation.PushOperand(this.maskMapSampler, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.psInMaskTexcoord, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.reflectionMapSampler, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.psInReflectionTexcoord, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.psOutDiffuse, Operand.OpSemantic.In,
                                       (int)(Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z));
            funcInvocation.PushOperand(this.reflectionPower, Operand.OpSemantic.In);
            funcInvocation.PushOperand(this.psOutDiffuse, Operand.OpSemantic.Out,
                                       (int)(Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z));

            psMain.AddAtomInstance(funcInvocation);

            return(true);
        }
示例#8
0
		protected bool AddPSFinalAssignmentInvocation( Function psMain, int groupOrder, ref int internalCounter )
		{
			var curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign,
			                                                (int)FFPRenderState.FFPFragmentShaderStage.PSColorBegin + 1,
			                                                internalCounter++ );
			curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.In );
			curFuncInvocation.PushOperand( this.psDiffuse, Operand.OpSemantic.Out );
			psMain.AddAtomInstance( curFuncInvocation );

			curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign,
			                                            (int)FFPRenderState.FFPFragmentShaderStage.PSColorBegin + 1,
			                                            internalCounter++ );
			curFuncInvocation.PushOperand( this.psDiffuse, Operand.OpSemantic.In );
			curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out );
			psMain.AddAtomInstance( curFuncInvocation );

			if ( this.specularEnable )
			{
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign,
				                                            (int)FFPRenderState.FFPFragmentShaderStage.PSColorBegin + 1,
				                                            internalCounter++ );
				curFuncInvocation.PushOperand( this.psTempSpecularColor, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( this.psSpecular, Operand.OpSemantic.Out );
				psMain.AddAtomInstance( curFuncInvocation );
			}
			return true;
		}
示例#9
0
		private bool AddPSGlobalIlluminationInvocation( Function psMain, int groupOrder, ref int internalCounter )
		{
			FunctionInvocation curFuncInvocation = null;
			if ( ( this.trackVertexColorType & TrackVertexColor.Ambient ) == 0 &&
			     ( this.trackVertexColorType & TrackVertexColor.Emissive ) == 0 )
			{
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign, groupOrder, internalCounter++ );
				curFuncInvocation.PushOperand( this.derivedSceneColor, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.Out );
				psMain.AddAtomInstance( curFuncInvocation );
			}
			else
			{
				if ( ( this.trackVertexColorType & TrackVertexColor.Ambient ) != 0 )
				{
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncModulate, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( this.lightAmbientColor, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.psDiffuse, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.Out );
					psMain.AddAtomInstance( curFuncInvocation );
				}
				else
				{
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( this.derivedAmbientLightColor, Operand.OpSemantic.In,
					                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
					curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.Out,
					                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
					psMain.AddAtomInstance( curFuncInvocation );
				}

				if ( ( this.trackVertexColorType & TrackVertexColor.Emissive ) != 0 )
				{
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAdd, groupOrder, internalCounter++ );
					curFuncInvocation.PushOperand( this.psDiffuse, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.Out );
					psMain.AddAtomInstance( curFuncInvocation );
				}
				else
				{
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAdd, groupOrder, internalCounter++ );
					curFuncInvocation.PushOperand( this.surfaceEmissiveColor, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.Out );
					psMain.AddAtomInstance( curFuncInvocation );
				}
			}

			if ( this.specularEnable )
			{
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign, groupOrder, internalCounter++ );
				curFuncInvocation.PushOperand( this.psSpecular, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( this.psTempSpecularColor, Operand.OpSemantic.Out );
				psMain.AddAtomInstance( curFuncInvocation );
			}

			return true;
		}
		private void AddPositionCalculations( Function vsMain, ref int funcCounter )
		{
			FunctionInvocation curFuncInvocation = null;

			if ( doBoneCalculations )
			{
				if ( scalingShearingSupport )
				{
					//Construct a scaling and shearing matrix based on the blend weights
					for ( int i = 0; i < WeightCount; i++ )
					{
						//Assign the local param based on the current index of the scaling and shearing matrices
						curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign,
						                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
						                                            funcCounter++ );
						curFuncInvocation.PushOperand( this.paramInScaleShearMatrices, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( paramInIndices, Operand.OpSemantic.In, (int)IndexToMask( i ), 1 );
						curFuncInvocation.PushOperand( this.paramTempFloat3x4, Operand.OpSemantic.Out );
						vsMain.AddAtomInstance( curFuncInvocation );

						//Calculate the resultant scaling and shearing matrix based on the weigts given
						AddIndexedPositionWeight( vsMain, i, this.paramTempFloat3x4, this.paramTempFloat3x4, this.paramBlendS,
						                          ref funcCounter );
					}

					//Transform the position based on the scaling and shearing matrix
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
					                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
					                                            funcCounter++ );
					curFuncInvocation.PushOperand( this.paramBlendS, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( paramInPosition, Operand.OpSemantic.In,
					                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
					curFuncInvocation.PushOperand( this.paramLocalBlendPosition, Operand.OpSemantic.Out );
					vsMain.AddAtomInstance( curFuncInvocation );
				}
				else
				{
					//Assign the input position to the local blended position
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign,
					                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
					                                            funcCounter++ );
					curFuncInvocation.PushOperand( paramInPosition, Operand.OpSemantic.In,
					                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
					curFuncInvocation.PushOperand( this.paramLocalBlendPosition, Operand.OpSemantic.Out );
					vsMain.AddAtomInstance( curFuncInvocation );
				}

				//Set functions to calculate world position
				for ( int i = 0; i < weightCount; i++ )
				{
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign,
					                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
					                                            funcCounter++ );
					curFuncInvocation.PushOperand( paramInIndices, Operand.OpSemantic.In, (int)IndexToMask( i ) );
					curFuncInvocation.PushOperand( this.paramIndex1, Operand.OpSemantic.Out );
					vsMain.AddAtomInstance( curFuncInvocation );

					//multiply the index by 2
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncModulate,
					                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
					                                            funcCounter++ );
					curFuncInvocation.PushOperand( ParameterFactory.CreateConstParamFloat( 2.0f ), Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.paramIndex1, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.paramIndex1, Operand.OpSemantic.Out );
					vsMain.AddAtomInstance( curFuncInvocation );

					//Add 1 to the index and assign as the second row's index
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAdd,
					                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
					                                            funcCounter++ );
					curFuncInvocation.PushOperand( ParameterFactory.CreateConstParamFloat( 1.0f ), Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.paramIndex1, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.paramIndex2, Operand.OpSemantic.Out );
					vsMain.AddAtomInstance( curFuncInvocation );

					//Build the dual quaternion matrix
					curFuncInvocation = new FunctionInvocation(
						DualQuaternionSkinning.SGXFuncBuildDualQuaternionMatrix,
						(int)FFPRenderState.FFPVertexShaderStage.VSTransform, funcCounter++ );
					curFuncInvocation.PushOperand( paramInWorldMatrices, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.paramIndex1, Operand.OpSemantic.In, (int)Operand.OpMask.All, 1 );
					curFuncInvocation.PushOperand( paramInWorldMatrices, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.paramIndex2, Operand.OpSemantic.In, (int)Operand.OpMask.All, 1 );
					curFuncInvocation.PushOperand( this.paramTempFloat2x4, Operand.OpSemantic.Out );
					vsMain.AddAtomInstance( curFuncInvocation );

					if ( correctAntipodalityHandling )
					{
						AdjustForCorrectAntipodality( vsMain, i, ref funcCounter, this.paramTempFloat2x4 );
					}

					//Calculate the resultant dual quaternion based based on the weights given
					AddIndexedPositionWeight( vsMain, i, this.paramTempFloat2x4, this.paramTempFloat2x4, this.paramBlendDQ,
					                          ref funcCounter );
				}
				//Normalize the dual quaternion
				curFuncInvocation = new FunctionInvocation( DualQuaternionSkinning.SGXFuncNormalizeDualQuaternion,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( this.paramBlendDQ, Operand.OpSemantic.InOut );
				vsMain.AddAtomInstance( curFuncInvocation );

				//Calculate the blend position
				curFuncInvocation = new FunctionInvocation( DualQuaternionSkinning.SGXFuncCalculateBlendPosition,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( this.paramLocalBlendPosition, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( this.paramBlendDQ, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramTempFloat4, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );

				//Update from object to projective space
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramInViewProjMatrix, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramTempFloat4, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramOutPositionProj, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
			else
			{
				//update from object to world space
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramInWorldMatrices, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramInPosition, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramLocalPositionWorld, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );

				//update from object to projective space
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramInWorldViewProjMatrix, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramInPosition, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramOutPositionProj, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
		}
示例#11
0
		protected virtual void AddPSBlendInvocations( Function psMain, Parameter arg1, Parameter arg2, Parameter texel,
		                                              int samplerIndex, LayerBlendModeEx blendMode,
		                                              int groupOrder, ref int internalCounter, int targetChannels )
		{
			FunctionInvocation curFuncInvocation = null;

			switch ( blendMode.operation )
			{
				case LayerBlendOperationEx.Add:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAdd, groupOrder, internalCounter++ );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendOperationEx.AddSigned:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAddSigned, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendOperationEx.AddSmooth:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAddSmooth, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendOperationEx.BlendCurrentAlpha:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncLerp, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );

					if ( samplerIndex == 0 )
					{
						curFuncInvocation.PushOperand( this.psDiffuse, Operand.OpSemantic.In, Operand.OpMask.W );
					}
					else
					{
						curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.In, Operand.OpMask.W );
					}
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendOperationEx.BlendDiffuseAlpha:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncSubtract, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( this.psDiffuse, Operand.OpSemantic.In, Operand.OpMask.W );
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendOperationEx.BlendDiffuseColor:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncLerp, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( this.psDiffuse, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendOperationEx.BlendManual:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncLerp, groupOrder, internalCounter );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( ParameterFactory.CreateConstParamFloat( blendMode.blendFactor ),
					                               Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendOperationEx.BlendTextureAlpha:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncLerp, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( texel, Operand.OpSemantic.In, Operand.OpMask.W );
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendOperationEx.DotProduct:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncDotProduct, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendOperationEx.Modulate:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncModulate, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendOperationEx.ModulateX2:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncModulateX2, groupOrder,
					                                            internalCounter );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendOperationEx.ModulateX4:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncModulateX4, groupOrder,
					                                            internalCounter );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendOperationEx.Source1:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendOperationEx.Source2:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendOperationEx.Subtract:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncSubtract, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
			}
		}
示例#12
0
		protected virtual void AddPSArgumentInvocations( Function psMain, Parameter arg, Parameter texel,
		                                                 int samplerIndex, LayerBlendSource blendSrc, ColorEx colorValue,
		                                                 Real alphaValue, bool isAlphaArgument, int groupOrder,
		                                                 ref int internalCounter )
		{
			FunctionInvocation curFuncInvocation = null;

			switch ( blendSrc )
			{
				case LayerBlendSource.Current:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign, groupOrder, internalCounter++ );
					if ( samplerIndex == 0 )
					{
						curFuncInvocation.PushOperand( this.psDiffuse, Operand.OpSemantic.In );
					}
					else
					{
						curFuncInvocation.PushOperand( this.psOutDiffuse, Operand.OpSemantic.In );
					}
					curFuncInvocation.PushOperand( arg, Operand.OpSemantic.Out );
					psMain.AddAtomInstance( curFuncInvocation );
					break;

				case LayerBlendSource.Texture:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( texel, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( arg, Operand.OpSemantic.Out );
					psMain.AddAtomInstance( curFuncInvocation );
					break;

				case LayerBlendSource.Specular:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( this.psSpecular, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( arg, Operand.OpSemantic.Out );
					psMain.AddAtomInstance( curFuncInvocation );
					break;

				case LayerBlendSource.Diffuse:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign, groupOrder,
					                                            internalCounter++ );
					curFuncInvocation.PushOperand( this.psDiffuse, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( arg, Operand.OpSemantic.Out );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
				case LayerBlendSource.Manual:
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncConstruct, groupOrder,
					                                            internalCounter++ );

					if ( isAlphaArgument )
					{
						curFuncInvocation.PushOperand( ParameterFactory.CreateConstParamFloat( alphaValue ),
						                               Operand.OpSemantic.In );
					}
					else
					{
						curFuncInvocation.PushOperand( ParameterFactory.CreateConstParamFloat( colorValue.r ),
						                               Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( ParameterFactory.CreateConstParamFloat( colorValue.g ),
						                               Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( ParameterFactory.CreateConstParamFloat( colorValue.b ),
						                               Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( ParameterFactory.CreateConstParamFloat( colorValue.a ),
						                               Operand.OpSemantic.In );
					}

					curFuncInvocation.PushOperand( arg, Operand.OpSemantic.In );
					psMain.AddAtomInstance( curFuncInvocation );
					break;
			}
		}
示例#13
0
		private void AddPositionCalculations( Function vsMain, ref int funcCounter )
		{
			FunctionInvocation curFuncInvocation = null;

			if ( doBoneCalculations == true )
			{
				//set functions to calculate world position
				for ( int i = 0; i < WeightCount; i++ )
				{
					AddIndexedPositionWeight( vsMain, i, ref funcCounter );
				}

				//update back the original position relative to the object
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramInInvWorldMatrix, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramLocalPositionWorld, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramInPosition, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );

				//update the projective position thereby filling the transform stage role
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramInViewProjMatrix, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramLocalPositionWorld, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramOutPositionProj, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
			else
			{
				//update from object to world space
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramInWorldMatrix, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramInPosition, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramLocalPositionWorld, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );

				//update from ojbect to projective space
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramInWorldViewProjMatrix, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramInPosition, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramOutPositionProj, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
		}
示例#14
0
		protected virtual void AddPSSampleTexelInvocation( TextureUnitParams textureUnitParams, Function psMain,
		                                                   Parameter texel, int groupOrder, ref int internalCounter )
		{
			FunctionInvocation curFuncInvocation = null;
			if ( textureUnitParams.TexCoordCalcMethod == TexCoordCalcMethod.ProjectiveTexture )
			{
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncSamplerTextureProj, groupOrder,
				                                            internalCounter++ );
			}
			else
			{
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncSampleTexture, groupOrder,
				                                            internalCounter++ );
			}

			curFuncInvocation.PushOperand( textureUnitParams.TextureSampler, Operand.OpSemantic.In );
			curFuncInvocation.PushOperand( textureUnitParams.PSInputTexCoord, Operand.OpSemantic.In );
			curFuncInvocation.PushOperand( texel, Operand.OpSemantic.Out );
			psMain.AddAtomInstance( curFuncInvocation );
		}
示例#15
0
		protected override void AddPSBlendInvocations( Function psMain, Parameter arg1, Parameter arg2, Parameter texel,
		                                               int samplerIndex, Graphics.LayerBlendModeEx blendMode,
		                                               int groupOrder, ref int internalCounter, int targetChannels )
		{
			//Add the modifier invocation

			AddPSModifierInvocation( psMain, samplerIndex, arg1, arg2, groupOrder, ref internalCounter, targetChannels );

			//Add the blending fucntion invocations
			BlendMode mode = GetBlendMode( samplerIndex );

			if ( ( mode == BlendMode.FFPBlend ) || ( mode == BlendMode.Invalid ) )
			{
				base.AddPSBlendInvocations( psMain, arg1, arg2, texel, samplerIndex, blendMode, groupOrder,
				                            ref internalCounter, targetChannels );
			}
			else
			{
				//find the function name for the blend mode
				string funcName = string.Empty;

				for ( int i = 0; i < blendModes.Length; i++ )
				{
					if ( blendModes[ i ].Type == mode )
					{
						funcName = blendModes[ i ].FuncName;
						break;
					}
				}

				if ( funcName != string.Empty )
				{
					var curFuncInvocation = new FunctionInvocation( funcName, groupOrder, internalCounter++ );
					curFuncInvocation.PushOperand( arg1, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( arg2, Operand.OpSemantic.In, targetChannels );
					curFuncInvocation.PushOperand( psOutDiffuse, Operand.OpSemantic.Out, targetChannels );
					psMain.AddAtomInstance( curFuncInvocation );
				}
			}
		}
		private void AdjustForCorrectAntipodality( Function vsMain, int index, ref int funcCounter,
		                                           Parameter tempWorldMatrix )
		{
			FunctionInvocation curFuncInvocation = null;
			//Antipodality doesn't need to be adjusted for dq0 on itself (used as the basis of antipodality calculations)
			if ( index > 0 )
			{
				curFuncInvocation = new FunctionInvocation( SGXFuncAntipodalityAdjustment,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				//This is the base dual quaternion dq0, which the antipodality calculations are based on
				curFuncInvocation.PushOperand( this.paramInitialDQ, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( this.paramTempFloat2x4, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( tempWorldMatrix, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
			else if ( index == 0 )
			{
				//Set the first dual quaternion as the initial dq
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( this.paramTempFloat2x4, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( this.paramInitialDQ, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
		}
		private void AddNormalRelatedCalculations( Function vsMain, Parameter normalRelatedParam,
		                                           Parameter normalWorldRelatedParam, ref int funcCounter )
		{
			FunctionInvocation curFuncInvocation = null;

			if ( doBoneCalculations )
			{
				if ( scalingShearingSupport )
				{
					//Calculate the adjoint transpose of the blended scaling and shearing matrix
					curFuncInvocation = new FunctionInvocation( DualQuaternionSkinning.SGXFuncAdjointTransposeMatrix,
					                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
					                                            funcCounter++ );
					curFuncInvocation.PushOperand( this.paramBlendS, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( this.paramTempFloat3x3, Operand.OpSemantic.Out );
					vsMain.AddAtomInstance( curFuncInvocation );

					//Transform the normal by the adjoint transpose of the blended scaling and shearing matrix
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
					                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
					                                            funcCounter++ );
					curFuncInvocation.PushOperand( this.paramTempFloat3x3, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( normalRelatedParam, Operand.OpSemantic.In );
					curFuncInvocation.PushOperand( normalRelatedParam, Operand.OpSemantic.Out );
					vsMain.AddAtomInstance( curFuncInvocation );

					//Need to normalize again after transforming the normal
					curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncNormalize,
					                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
					                                            funcCounter++ );
					curFuncInvocation.PushOperand( normalRelatedParam, Operand.OpSemantic.InOut );
					vsMain.AddAtomInstance( curFuncInvocation );
				}

				//Transform the normal according to the dual quaternion
				curFuncInvocation = new FunctionInvocation( DualQuaternionSkinning.SGXFuncCalculateBlendNormal,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( normalRelatedParam, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( this.paramBlendDQ, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( normalWorldRelatedParam, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );

				//update back the original position relative to the object
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramInInvWorldMatrix, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( normalWorldRelatedParam, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( normalRelatedParam, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
			else
			{
				//update from object to world space
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramInWorldMatrix, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( normalRelatedParam, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( normalWorldRelatedParam, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
		}
示例#18
0
		private void AddIndexedNormalRelatedWeight( Function vsMain, Parameter normalRelatedParam,
		                                            Parameter normalWorldRelatedParam, int index, ref int funcCounter )
		{
			FunctionInvocation curFuncInvocation;
			Operand.OpMask indexMask = IndexToMask( index );

			//multiply position with world matrix and put into temporary param
			curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
			                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
			                                            funcCounter++ );
			curFuncInvocation.PushOperand( paramInWorldMatrices, Operand.OpSemantic.In, (int)Operand.OpMask.All );
			curFuncInvocation.PushOperand( paramInIndices, Operand.OpSemantic.In, (int)indexMask, 1 );
			curFuncInvocation.PushOperand( normalRelatedParam, Operand.OpSemantic.In );
			curFuncInvocation.PushOperand( paramTempFloat3, Operand.OpSemantic.Out );
			vsMain.AddAtomInstance( curFuncInvocation );

			//multiply temporary param with weight
			curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncModulate,
			                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
			                                            funcCounter++ );
			curFuncInvocation.PushOperand( paramTempFloat3, Operand.OpSemantic.In );
			curFuncInvocation.PushOperand( paramInWeights, Operand.OpSemantic.In, (int)indexMask );
			curFuncInvocation.PushOperand( paramTempFloat3, Operand.OpSemantic.Out );
			vsMain.AddAtomInstance( curFuncInvocation );

			//check if on first iteration
			if ( index == 0 )
			{
				//set the local param as the value of the world normal
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramTempFloat3, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( normalWorldRelatedParam, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( normalWorldRelatedParam, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
			else
			{
				//add the local param as the value of the world normal
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAdd,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramTempFloat3, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( normalWorldRelatedParam, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( normalWorldRelatedParam, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
		}
示例#19
0
		private void AddNormalRelatedCalculations( Function vsMain, Parameter normalRelatedParam,
		                                           Parameter normalWorldRelatedParam, ref int funcCounter )
		{
			FunctionInvocation curFuncInvocation;

			if ( doBoneCalculations )
			{
				//set functions to calculate world normal
				for ( int i = 0; i < weightCount; i++ )
				{
					AddIndexedNormalRelatedWeight( vsMain, normalRelatedParam, normalWorldRelatedParam, i,
					                               ref funcCounter );
				}

				//update back the original position relative to the object
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramInInvWorldMatrix, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( normalWorldRelatedParam, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( normalRelatedParam, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
			else
			{
				//update back the original position relative to the object
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramInWorldMatrix, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( normalRelatedParam, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( normalWorldRelatedParam, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
		}
示例#20
0
		private void AddIndexedPositionWeight( Function vsMain, int index, ref int funcCounter )
		{
			Operand.OpMask indexMask = IndexToMask( index );

			FunctionInvocation curFuncInvocation;

			var outputMask = (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z );

			if ( paramInWorldMatrices.Type == GpuProgramParameters.GpuConstantType.Matrix_4X4 )
			{
				outputMask = (int)Operand.OpMask.All;
			}

			//multiply posiiton with world matrix and put into temporary param
			curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform,
			                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
			                                            funcCounter++ );
			curFuncInvocation.PushOperand( paramInWorldMatrix, Operand.OpSemantic.In );
			curFuncInvocation.PushOperand( paramInIndices, Operand.OpSemantic.In, (int)indexMask, 1 );
			curFuncInvocation.PushOperand( paramInPosition, Operand.OpSemantic.In );
			curFuncInvocation.PushOperand( paramTempFloat4, Operand.OpSemantic.Out, outputMask );
			vsMain.AddAtomInstance( curFuncInvocation );

			//set w value of temporary param to 1
			curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign,
			                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
			                                            funcCounter++ );
			curFuncInvocation.PushOperand( ParameterFactory.CreateConstParamFloat( 1.0f ), Operand.OpSemantic.In );
			curFuncInvocation.PushOperand( paramTempFloat4, Operand.OpSemantic.Out, (int)Operand.OpMask.W );
			vsMain.AddAtomInstance( curFuncInvocation );

			//multiply temporary param with weight
			curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncModulate,
			                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
			                                            funcCounter++ );
			curFuncInvocation.PushOperand( paramTempFloat4, Operand.OpSemantic.In );
			curFuncInvocation.PushOperand( paramInWeights, Operand.OpSemantic.In, (int)indexMask );
			curFuncInvocation.PushOperand( paramTempFloat4, Operand.OpSemantic.Out );
			vsMain.AddAtomInstance( curFuncInvocation );

			//check if on first iteration
			if ( index == 0 )
			{
				//set the local param as the value of the world param
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramTempFloat4, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramLocalPositionWorld, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
			else
			{
				//add the local param as the value of the world param
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAdd,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( paramTempFloat4, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramLocalPositionWorld, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( paramLocalPositionWorld, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
		}
示例#21
0
		protected bool AddVSInvocation( Function vsMain, int groupOrder, ref int internalCounter )
		{
			FunctionInvocation curFuncInvocation = null;

			//transform normal in view space
			curFuncInvocation = new FunctionInvocation( SGXFuncTransformNormal, groupOrder, internalCounter++ );
			curFuncInvocation.PushOperand( this.worldViewITMatrix, Operand.OpSemantic.In );
			curFuncInvocation.PushOperand( this.vsInNormal, Operand.OpSemantic.In );
			curFuncInvocation.PushOperand( this.vsOutNormal, Operand.OpSemantic.Out );
			vsMain.AddAtomInstance( curFuncInvocation );

			//Transform view space position if need to
			if ( this.vsOutViewPos != null )
			{
				curFuncInvocation = new FunctionInvocation( SGXFuncTransformPosition, groupOrder, internalCounter++ );
				curFuncInvocation.PushOperand( this.worldViewMatrix, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( this.vsInPosition, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( this.vsOutViewPos, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}

			return true;
		}
示例#22
0
		private bool AddVSInvocation( Function vsMain, int groupOrder, ref int internalCounter )
		{
			FunctionInvocation curFuncInvocation;

			//Output the vertex depth in camera space
			curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign, groupOrder, internalCounter++ );
			curFuncInvocation.PushOperand( this.vsOutPos, Operand.OpSemantic.In, Operand.OpMask.Z );
			curFuncInvocation.PushOperand( this.vsOutDepth, Operand.OpSemantic.Out );
			vsMain.AddAtomInstance( curFuncInvocation );

			//compute world space position
			foreach ( var it in this.shadowTextureParamsList )
			{
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncTransform, groupOrder,
				                                            internalCounter++ );
				curFuncInvocation.PushOperand( it.WorldViewProjMatrix, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( this.vsInPos, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( it.VSOutLightPosition, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
			return true;
		}
示例#23
0
		internal bool AddPSIlluminationInvocation( LightParams curLightParams, Function psMain, int groupOrder,
		                                           ref int internalCounter )
		{
			FunctionInvocation curFuncInvocation = null;

			//merge diffuse color with vertex color if need to
			if ( ( this.trackVertexColorType & TrackVertexColor.Diffuse ) != 0 )
			{
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncModulate, groupOrder,
				                                            internalCounter++ );
				curFuncInvocation.PushOperand( this.psDiffuse, Operand.OpSemantic.In,
				                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
				curFuncInvocation.PushOperand( curLightParams.DiffuseColor, Operand.OpSemantic.In,
				                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
				curFuncInvocation.PushOperand( curLightParams.DiffuseColor, Operand.OpSemantic.Out,
				                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
				psMain.AddAtomInstance( curFuncInvocation );
			}
			//merge specular color with vertex color if need to
			if ( this.specularEnable && ( this.trackVertexColorType & TrackVertexColor.Specular ) != 0 )
			{
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncModulate, groupOrder,
				                                            internalCounter++ );
				curFuncInvocation.PushOperand( this.psDiffuse, Operand.OpSemantic.In,
				                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
				curFuncInvocation.PushOperand( curLightParams.SpecularColor, Operand.OpSemantic.In,
				                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
				curFuncInvocation.PushOperand( curLightParams.SpecularColor, Operand.OpSemantic.Out,
				                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
				psMain.AddAtomInstance( curFuncInvocation );
			}

			switch ( curLightParams.Type )
			{
				case LightType.Directional:
					if ( this.specularEnable )
					{
						curFuncInvocation = new FunctionInvocation( SGXFuncLightDirectionalDiffuseSpecular, groupOrder,
						                                            internalCounter++ );
						curFuncInvocation.PushOperand( this.psInNormal, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( this.psInViewPos, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( curLightParams.Direction, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( curLightParams.DiffuseColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( curLightParams.SpecularColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.surfaceShininess, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempSpecularColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.Out,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempSpecularColor, Operand.OpSemantic.Out,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						psMain.AddAtomInstance( curFuncInvocation );
					}

					else
					{
						curFuncInvocation = new FunctionInvocation( SGXFuncLightDirectionalDiffuse, groupOrder,
						                                            internalCounter++ );
						curFuncInvocation.PushOperand( this.psInNormal, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( curLightParams.Direction, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( curLightParams.DiffuseColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.Out,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						psMain.AddAtomInstance( curFuncInvocation );
					}
					break;
				case LightType.Point:
					if ( this.specularEnable )
					{
						curFuncInvocation = new FunctionInvocation( SGXFuncLightPointDiffuseSpecular, groupOrder,
						                                            internalCounter++ );
						curFuncInvocation.PushOperand( this.psInNormal, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( this.psInViewPos, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( curLightParams.Position, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( curLightParams.AttenuatParams, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( curLightParams.DiffuseColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( curLightParams.SpecularColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.surfaceShininess, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempSpecularColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.Out,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempSpecularColor, Operand.OpSemantic.Out,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						psMain.AddAtomInstance( curFuncInvocation );
					}
					else
					{
						curFuncInvocation = new FunctionInvocation( SGXFuncLightPointDiffuse, groupOrder,
						                                            internalCounter++ );
						curFuncInvocation.PushOperand( this.psInNormal, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( this.psInViewPos, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( curLightParams.Position, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( curLightParams.AttenuatParams, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( curLightParams.DiffuseColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.Out,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						psMain.AddAtomInstance( curFuncInvocation );
					}
					break;
				case LightType.Spotlight:
					if ( this.specularEnable )
					{
						curFuncInvocation = new FunctionInvocation( SGXFuncLightSpotDiffuseSpecular, groupOrder,
						                                            internalCounter++ );
						curFuncInvocation.PushOperand( this.psInNormal, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( this.psInViewPos, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( curLightParams.Position, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( curLightParams.Direction, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( curLightParams.AttenuatParams, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( curLightParams.SpotParams, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( curLightParams.DiffuseColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( curLightParams.SpecularColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.surfaceShininess, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempSpecularColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.Out,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempSpecularColor, Operand.OpSemantic.Out,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
					}
					else
					{
						curFuncInvocation = new FunctionInvocation( SGXFuncLightSpotDiffuse, groupOrder,
						                                            internalCounter++ );
						curFuncInvocation.PushOperand( this.psInNormal, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( this.psInViewPos, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( curLightParams.Position, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( curLightParams.Direction, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( curLightParams.AttenuatParams, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( curLightParams.SpotParams, Operand.OpSemantic.In );
						curFuncInvocation.PushOperand( curLightParams.DiffuseColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.In,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						curFuncInvocation.PushOperand( this.psTempDiffuseColor, Operand.OpSemantic.Out,
						                               (int)( Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z ) );
						psMain.AddAtomInstance( curFuncInvocation );
					}
					break;
			}

			return true;
		}
示例#24
0
        private void AddPositionCalculations(Function vsMain, ref int funcCounter)
        {
            FunctionInvocation curFuncInvocation = null;

            if (doBoneCalculations)
            {
                if (scalingShearingSupport)
                {
                    //Construct a scaling and shearing matrix based on the blend weights
                    for (int i = 0; i < WeightCount; i++)
                    {
                        //Assign the local param based on the current index of the scaling and shearing matrices
                        curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncAssign,
                                                                   (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                                   funcCounter++);
                        curFuncInvocation.PushOperand(this.paramInScaleShearMatrices, Operand.OpSemantic.In);
                        curFuncInvocation.PushOperand(paramInIndices, Operand.OpSemantic.In, (int)IndexToMask(i), 1);
                        curFuncInvocation.PushOperand(this.paramTempFloat3x4, Operand.OpSemantic.Out);
                        vsMain.AddAtomInstance(curFuncInvocation);

                        //Calculate the resultant scaling and shearing matrix based on the weigts given
                        AddIndexedPositionWeight(vsMain, i, this.paramTempFloat3x4, this.paramTempFloat3x4, this.paramBlendS,
                                                 ref funcCounter);
                    }

                    //Transform the position based on the scaling and shearing matrix
                    curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncTransform,
                                                               (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                               funcCounter++);
                    curFuncInvocation.PushOperand(this.paramBlendS, Operand.OpSemantic.In);
                    curFuncInvocation.PushOperand(paramInPosition, Operand.OpSemantic.In,
                                                  (int)(Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z));
                    curFuncInvocation.PushOperand(this.paramLocalBlendPosition, Operand.OpSemantic.Out);
                    vsMain.AddAtomInstance(curFuncInvocation);
                }
                else
                {
                    //Assign the input position to the local blended position
                    curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncAssign,
                                                               (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                               funcCounter++);
                    curFuncInvocation.PushOperand(paramInPosition, Operand.OpSemantic.In,
                                                  (int)(Operand.OpMask.X | Operand.OpMask.Y | Operand.OpMask.Z));
                    curFuncInvocation.PushOperand(this.paramLocalBlendPosition, Operand.OpSemantic.Out);
                    vsMain.AddAtomInstance(curFuncInvocation);
                }

                //Set functions to calculate world position
                for (int i = 0; i < weightCount; i++)
                {
                    curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncAssign,
                                                               (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                               funcCounter++);
                    curFuncInvocation.PushOperand(paramInIndices, Operand.OpSemantic.In, (int)IndexToMask(i));
                    curFuncInvocation.PushOperand(this.paramIndex1, Operand.OpSemantic.Out);
                    vsMain.AddAtomInstance(curFuncInvocation);

                    //multiply the index by 2
                    curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncModulate,
                                                               (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                               funcCounter++);
                    curFuncInvocation.PushOperand(ParameterFactory.CreateConstParamFloat(2.0f), Operand.OpSemantic.In);
                    curFuncInvocation.PushOperand(this.paramIndex1, Operand.OpSemantic.In);
                    curFuncInvocation.PushOperand(this.paramIndex1, Operand.OpSemantic.Out);
                    vsMain.AddAtomInstance(curFuncInvocation);

                    //Add 1 to the index and assign as the second row's index
                    curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncAdd,
                                                               (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                               funcCounter++);
                    curFuncInvocation.PushOperand(ParameterFactory.CreateConstParamFloat(1.0f), Operand.OpSemantic.In);
                    curFuncInvocation.PushOperand(this.paramIndex1, Operand.OpSemantic.In);
                    curFuncInvocation.PushOperand(this.paramIndex2, Operand.OpSemantic.Out);
                    vsMain.AddAtomInstance(curFuncInvocation);

                    //Build the dual quaternion matrix
                    curFuncInvocation = new FunctionInvocation(
                        DualQuaternionSkinning.SGXFuncBuildDualQuaternionMatrix,
                        (int)FFPRenderState.FFPVertexShaderStage.VSTransform, funcCounter++);
                    curFuncInvocation.PushOperand(paramInWorldMatrices, Operand.OpSemantic.In);
                    curFuncInvocation.PushOperand(this.paramIndex1, Operand.OpSemantic.In, (int)Operand.OpMask.All, 1);
                    curFuncInvocation.PushOperand(paramInWorldMatrices, Operand.OpSemantic.In);
                    curFuncInvocation.PushOperand(this.paramIndex2, Operand.OpSemantic.In, (int)Operand.OpMask.All, 1);
                    curFuncInvocation.PushOperand(this.paramTempFloat2x4, Operand.OpSemantic.Out);
                    vsMain.AddAtomInstance(curFuncInvocation);

                    if (correctAntipodalityHandling)
                    {
                        AdjustForCorrectAntipodality(vsMain, i, ref funcCounter, this.paramTempFloat2x4);
                    }

                    //Calculate the resultant dual quaternion based based on the weights given
                    AddIndexedPositionWeight(vsMain, i, this.paramTempFloat2x4, this.paramTempFloat2x4, this.paramBlendDQ,
                                             ref funcCounter);
                }
                //Normalize the dual quaternion
                curFuncInvocation = new FunctionInvocation(DualQuaternionSkinning.SGXFuncNormalizeDualQuaternion,
                                                           (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                           funcCounter++);
                curFuncInvocation.PushOperand(this.paramBlendDQ, Operand.OpSemantic.InOut);
                vsMain.AddAtomInstance(curFuncInvocation);

                //Calculate the blend position
                curFuncInvocation = new FunctionInvocation(DualQuaternionSkinning.SGXFuncCalculateBlendPosition,
                                                           (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                           funcCounter++);
                curFuncInvocation.PushOperand(this.paramLocalBlendPosition, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(this.paramBlendDQ, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(paramTempFloat4, Operand.OpSemantic.Out);
                vsMain.AddAtomInstance(curFuncInvocation);

                //Update from object to projective space
                curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncTransform,
                                                           (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                           funcCounter++);
                curFuncInvocation.PushOperand(paramInViewProjMatrix, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(paramTempFloat4, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(paramOutPositionProj, Operand.OpSemantic.Out);
                vsMain.AddAtomInstance(curFuncInvocation);
            }
            else
            {
                //update from object to world space
                curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncTransform,
                                                           (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                           funcCounter++);
                curFuncInvocation.PushOperand(paramInWorldMatrices, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(paramInPosition, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(paramLocalPositionWorld, Operand.OpSemantic.Out);
                vsMain.AddAtomInstance(curFuncInvocation);

                //update from object to projective space
                curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncTransform,
                                                           (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                           funcCounter++);
                curFuncInvocation.PushOperand(paramInWorldViewProjMatrix, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(paramInPosition, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(paramOutPositionProj, Operand.OpSemantic.Out);
                vsMain.AddAtomInstance(curFuncInvocation);
            }
        }
示例#25
0
		private void AddPSModifierInvocation( Function psMain, int samplerIndex, Parameter arg1, Parameter arg2,
		                                      int groupOrder, ref int internalCounter, int targetChanells )
		{
			SourceModifier modType;
			int customNum;
			if ( GetSourceModifier( samplerIndex, out modType, out customNum ) == true )
			{
				Parameter modifiedParam = null;
				string funcName = string.Empty;
				switch ( modType )
				{
					case SourceModifier.Source1Modulate:
						funcName = "SGX_src_mod_modulate";
						modifiedParam = arg1;
						break;
					case SourceModifier.Source2Modulate:
						funcName = "SGX_src_mod_modulate";
						modifiedParam = arg2;
						break;
					case SourceModifier.Source1InvModulate:
						funcName = "SGX_src_mod_inv_modulate";
						modifiedParam = arg1;
						break;
					case SourceModifier.Source2InvModulate:
						funcName = "SGX_src_mod_inv_modulate";
						modifiedParam = arg2;
						break;
					default:
						break;
				}

				//add the function of the blend mode
				if ( funcName != string.Empty )
				{
					Parameter controlParam = this.textureBlends[ samplerIndex ].ModControlParam;

					var curFuncInvocation = new FunctionInvocation( funcName, groupOrder, internalCounter++ );
					curFuncInvocation.PushOperand( modifiedParam, Operand.OpSemantic.In, targetChanells );
					curFuncInvocation.PushOperand( controlParam, Operand.OpSemantic.In, targetChanells );
					curFuncInvocation.PushOperand( modifiedParam, Operand.OpSemantic.Out, targetChanells );
					psMain.AddAtomInstance( curFuncInvocation );
				}
			}
		}
示例#26
0
        private void AddNormalRelatedCalculations(Function vsMain, Parameter normalRelatedParam,
                                                  Parameter normalWorldRelatedParam, ref int funcCounter)
        {
            FunctionInvocation curFuncInvocation = null;

            if (doBoneCalculations)
            {
                if (scalingShearingSupport)
                {
                    //Calculate the adjoint transpose of the blended scaling and shearing matrix
                    curFuncInvocation = new FunctionInvocation(DualQuaternionSkinning.SGXFuncAdjointTransposeMatrix,
                                                               (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                               funcCounter++);
                    curFuncInvocation.PushOperand(this.paramBlendS, Operand.OpSemantic.In);
                    curFuncInvocation.PushOperand(this.paramTempFloat3x3, Operand.OpSemantic.Out);
                    vsMain.AddAtomInstance(curFuncInvocation);

                    //Transform the normal by the adjoint transpose of the blended scaling and shearing matrix
                    curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncTransform,
                                                               (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                               funcCounter++);
                    curFuncInvocation.PushOperand(this.paramTempFloat3x3, Operand.OpSemantic.In);
                    curFuncInvocation.PushOperand(normalRelatedParam, Operand.OpSemantic.In);
                    curFuncInvocation.PushOperand(normalRelatedParam, Operand.OpSemantic.Out);
                    vsMain.AddAtomInstance(curFuncInvocation);

                    //Need to normalize again after transforming the normal
                    curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncNormalize,
                                                               (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                               funcCounter++);
                    curFuncInvocation.PushOperand(normalRelatedParam, Operand.OpSemantic.InOut);
                    vsMain.AddAtomInstance(curFuncInvocation);
                }

                //Transform the normal according to the dual quaternion
                curFuncInvocation = new FunctionInvocation(DualQuaternionSkinning.SGXFuncCalculateBlendNormal,
                                                           (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                           funcCounter++);
                curFuncInvocation.PushOperand(normalRelatedParam, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(this.paramBlendDQ, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(normalWorldRelatedParam, Operand.OpSemantic.Out);
                vsMain.AddAtomInstance(curFuncInvocation);

                //update back the original position relative to the object
                curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncTransform,
                                                           (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                           funcCounter++);
                curFuncInvocation.PushOperand(paramInInvWorldMatrix, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(normalWorldRelatedParam, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(normalRelatedParam, Operand.OpSemantic.Out);
                vsMain.AddAtomInstance(curFuncInvocation);
            }
            else
            {
                //update from object to world space
                curFuncInvocation = new FunctionInvocation(FFPRenderState.FFPFuncTransform,
                                                           (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
                                                           funcCounter++);
                curFuncInvocation.PushOperand(paramInWorldMatrix, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(normalRelatedParam, Operand.OpSemantic.In);
                curFuncInvocation.PushOperand(normalWorldRelatedParam, Operand.OpSemantic.Out);
                vsMain.AddAtomInstance(curFuncInvocation);
            }
        }
示例#27
0
		private bool AddVSFunctionInvocations( TextureUnitParams textureUnitParams, Function vsMain )
		{
			FunctionInvocation texCoordCalcFunc = null;

			switch ( textureUnitParams.TexCoordCalcMethod )
			{
				case TexCoordCalcMethod.None:
					if ( textureUnitParams.TextureMatrix == null )
					{
						texCoordCalcFunc = new FunctionInvocation( FFPRenderState.FFPFuncAssign,
						                                           (int)FFPRenderState.FFPVertexShaderStage.VSTexturing,
						                                           textureUnitParams.TextureSamplerIndex );

						texCoordCalcFunc.PushOperand( textureUnitParams.VSInputTexCoord, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( textureUnitParams.VSOutputTexCoord, Operand.OpSemantic.Out );
					}
					else
					{
						texCoordCalcFunc = new FunctionInvocation( FFPRenderState.FFPFuncTransformTexCoord,
						                                           (int)FFPRenderState.FFPVertexShaderStage.VSTexturing,
						                                           textureUnitParams.TextureSamplerIndex );
						texCoordCalcFunc.PushOperand( textureUnitParams.TextureMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( textureUnitParams.VSInputTexCoord, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( textureUnitParams.VSOutputTexCoord, Operand.OpSemantic.Out );
					}
					break;
				case TexCoordCalcMethod.EnvironmentMap:
				case TexCoordCalcMethod.EnvironmentMapPlanar:
					if ( textureUnitParams.TextureMatrix == null )
					{
						texCoordCalcFunc = new FunctionInvocation( FFPRenderState.FFPFunGenerateTexcoordEnvSphere,
						                                           (int)FFPRenderState.FFPVertexShaderStage.VSTexturing,
						                                           textureUnitParams.TextureSamplerIndex );
						texCoordCalcFunc.PushOperand( this.worldITMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.viewMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.vsInputNormal, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( textureUnitParams.VSOutputTexCoord, Operand.OpSemantic.Out );
					}
					else
					{
						texCoordCalcFunc = new FunctionInvocation( FFPRenderState.FFPFunGenerateTexcoordEnvSphere,
						                                           (int)FFPRenderState.FFPVertexShaderStage.VSTexturing,
						                                           textureUnitParams.TextureSamplerIndex );

						texCoordCalcFunc.PushOperand( this.worldITMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.viewMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( textureUnitParams.TextureMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.vsInputNormal, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( textureUnitParams.VSOutputTexCoord, Operand.OpSemantic.Out );
					}
					break;

				case TexCoordCalcMethod.EnvironmentMapReflection:
					if ( textureUnitParams.TextureMatrix == null )
					{
						texCoordCalcFunc = new FunctionInvocation( FFPRenderState.FFPFuncGenerateTexCoordEnvReflect,
						                                           (int)FFPRenderState.FFPVertexShaderStage.VSTexturing,
						                                           textureUnitParams.TextureSamplerIndex );

						texCoordCalcFunc.PushOperand( this.worldMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.worldITMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.viewMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.vsInputNormal, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.vsInputPos, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( textureUnitParams.VSOutputTexCoord, Operand.OpSemantic.Out );
					}
					else
					{
						texCoordCalcFunc = new FunctionInvocation( FFPRenderState.FFPFuncGenerateTexCoordEnvReflect,
						                                           (int)FFPRenderState.FFPVertexShaderStage.VSTexturing,
						                                           textureUnitParams.TextureSamplerIndex );
						texCoordCalcFunc.PushOperand( this.worldMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.worldITMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.viewMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( textureUnitParams.TextureMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.vsInputNormal, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.vsInputPos, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( textureUnitParams.VSOutputTexCoord, Operand.OpSemantic.Out );
					}
					break;
				case TexCoordCalcMethod.EnvironmentMapNormal:
					if ( textureUnitParams.TextureMatrix == null )
					{
						texCoordCalcFunc = new FunctionInvocation( FFPRenderState.FFPFuncGenerateTexcoordEnvNormal,
						                                           (int)FFPRenderState.FFPVertexShaderStage.VSTexturing,
						                                           textureUnitParams.TextureSamplerIndex );

						texCoordCalcFunc.PushOperand( this.worldITMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.viewMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.vsInputPos, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( textureUnitParams.VSOutputTexCoord, Operand.OpSemantic.Out );
					}
					else
					{
						texCoordCalcFunc = new FunctionInvocation( FFPRenderState.FFPFuncGenerateTexcoordEnvNormal,
						                                           (int)FFPRenderState.FFPVertexShaderStage.VSTexturing,
						                                           textureUnitParams.TextureSamplerIndex );

						texCoordCalcFunc.PushOperand( this.worldITMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.viewMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( textureUnitParams.TextureMatrix, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( this.vsInputNormal, Operand.OpSemantic.In );
						texCoordCalcFunc.PushOperand( textureUnitParams.VSOutputTexCoord, Operand.OpSemantic.Out );
					}
					break;
				case TexCoordCalcMethod.ProjectiveTexture:
					texCoordCalcFunc = new FunctionInvocation( FFPRenderState.FFPFuncGenerateTexCoordProjection,
					                                           (int)FFPRenderState.FFPVertexShaderStage.VSTexturing,
					                                           textureUnitParams.TextureSamplerIndex );

					texCoordCalcFunc.PushOperand( this.worldMatrix, Operand.OpSemantic.In );
					texCoordCalcFunc.PushOperand( textureUnitParams.TextureViewProjImageMatrix, Operand.OpSemantic.In );
					texCoordCalcFunc.PushOperand( this.vsInputPos, Operand.OpSemantic.In );
					texCoordCalcFunc.PushOperand( textureUnitParams.VSOutputTexCoord, Operand.OpSemantic.Out );

					break;
			}

			if ( texCoordCalcFunc != null )
			{
				vsMain.AddAtomInstance( texCoordCalcFunc );
			}

			return true;
		}
		private void AddIndexedPositionWeight( Function vsMain, int index, Parameter worldMatrix,
		                                       Parameter positionTempParameter, Parameter positionRelatedOutputParam,
		                                       ref int funcCounter )
		{
			Operand.OpMask indexMask = IndexToMask( index );
			FunctionInvocation curFuncInvocation = null;

			//multiply position with world matrix and put into temporary param
			curFuncInvocation = new FunctionInvocation( SGXFuncBlendWeight,
			                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
			                                            funcCounter++ );
			curFuncInvocation.PushOperand( paramInWeights, Operand.OpSemantic.In, indexMask );
			curFuncInvocation.PushOperand( worldMatrix, Operand.OpSemantic.In );
			curFuncInvocation.PushOperand( positionTempParameter, Operand.OpSemantic.Out );
			vsMain.AddAtomInstance( curFuncInvocation );

			//check if on first iteration
			if ( index == 0 )
			{
				//set the local param as the value of the world param
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAssign,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( positionTempParameter, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( positionRelatedOutputParam, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
			else
			{
				//add the local param as the value of the world param
				curFuncInvocation = new FunctionInvocation( FFPRenderState.FFPFuncAdd,
				                                            (int)FFPRenderState.FFPVertexShaderStage.VSTransform,
				                                            funcCounter++ );
				curFuncInvocation.PushOperand( positionTempParameter, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( positionRelatedOutputParam, Operand.OpSemantic.In );
				curFuncInvocation.PushOperand( positionRelatedOutputParam, Operand.OpSemantic.Out );
				vsMain.AddAtomInstance( curFuncInvocation );
			}
		}