Exemple #1
0
        public void Set(string name, ParameterType type, int elementCount, IntPtr value, int checkTotalSizeInBytes)
        {
            if (NamedParameters == null)
            {
                NamedParameters = new Dictionary <string, NamedParameter>(32);
            }

            if (string.IsNullOrEmpty(name))
            {
                Log.Fatal("ParameterContainer: Set: Name can't be empty.");
            }
            if (!ParameterTypeUtility.CanConvertToByteArray(type))
            {
                Log.Fatal("ParameterContainer: Set: !ParameterTypeUtils.CanConvertToByteArray( type )");
            }

            //ParameterItem parameter = null;

            ////use current parameter or new depending format
            //{
            //	ParameterItem currentItem;
            //	if( parameters.TryGetValue( name, out currentItem ) )
            //	{
            //		if( type == currentItem.type && elementCount == currentItem.elementCount )
            //		{
            //			//!!!!!так?
            //			parameter = currentItem;
            //		}
            //		else
            //			Remove( name );
            //	}
            //}

            ////create parameter
            //if( parameter == null )
            //{
            //	parameter = new ParameterItem();
            //	parameter.container = this;
            //	parameter.name = name;
            //	parameter.type = type;
            //	parameter.elementCount = elementCount;
            //	parameters[ name ] = parameter;
            //}

            var parameter = new NamedParameter();

            parameter.Type         = type;
            parameter.ElementCount = elementCount;

            if (parameter.GetTotalSizeInBytes() != checkTotalSizeInBytes)
            {
                Log.Fatal("ParameterContainer: Set: parameter.GetValueSizeInBytes() != checkTotalSizeInBytes.");
            }

            //prepare data array
            //if( parameter.valueDataPosition == -1 )
            {
                int needSize = dataUsedBytes + parameter.GetTotalSizeInBytes();

                if (data == null)
                {
                    data = new byte[256];
                }

                if (needSize > data.Length)
                {
                    int newSize = data.Length * 2;
                    while (newSize < needSize)
                    {
                        newSize *= 2;
                    }
                    byte[] newData = new byte[newSize];
                    Buffer.BlockCopy(data, 0, newData, 0, dataUsedBytes);
                    data = newData;
                }

                parameter.ValueDataPosition = dataUsedBytes;
                dataUsedBytes += parameter.GetTotalSizeInBytes();
            }

            //copy value
            unsafe
            {
                fixed(byte *pData = data)
                NativeUtility.CopyMemory((IntPtr)(pData + parameter.ValueDataPosition), (IntPtr)value, parameter.GetTotalSizeInBytes());
            }

            if (NamedParameters == null)
            {
                NamedParameters = new Dictionary <string, NamedParameter>(32);
            }
            NamedParameters[name] = parameter;

            unchecked
            {
                version++;
            }

            //return parameter;
        }
Exemple #2
0
        public void Set(string name, object value, ParameterType type = ParameterType.Unknown, int elementCount = 0)
        {
            if (string.IsNullOrEmpty(name))
            {
                Log.Fatal("ParameterContainer: Set: Name can't be empty.");
            }
            if (value == null)
            {
                Log.Fatal("ParameterContainer: Set: value == null.");
            }

            //detect elementCount
            if (elementCount == 0)
            {
                if (value.GetType().IsArray)
                {
                    Array array = (Array)value;
                    elementCount = array.GetLength(0);
                }
                else
                {
                    elementCount = 1;
                }
            }

            //detect type
            if (type == ParameterType.Unknown)
            {
                Type elementType = null;
                {
                    if (value.GetType().IsArray)
                    {
                        elementType = value.GetType().GetElementType();
                    }
                    else
                    {
                        elementType = value.GetType();
                    }
                }

                //!!!!!reference values in array

                type = ParameterTypeUtility.DetectTypeByClassType(elementType);

                //!!!!было
                ////!!!!!так?
                ////detect texture type by the value
                //if( type == ParameterType.Unknown )
                //{
                //	GpuMaterialPass.TextureParameterValue textureValue = null;
                //	if( value.GetType().IsArray )
                //	{
                //		Array array = (Array)value;
                //		if( array.GetLength( 0 ) > 0 )
                //			textureValue = array.GetValue( 0 ) as GpuMaterialPass.TextureParameterValue;
                //	}
                //	else
                //		textureValue = value as GpuMaterialPass.TextureParameterValue;

                //	if( textureValue != null && textureValue.Texture != null )
                //	{
                //		var gpuTexture = textureValue.Texture.Result;
                //		if( gpuTexture != null )
                //		{
                //			switch( gpuTexture.TextureType )
                //			{
                //			//case Component_Texture.TypeEnum._1D: type = ParameterType.Texture1D; break;
                //			case Component_Image.TypeEnum._2D: type = ParameterType.Texture2D; break;
                //			case Component_Image.TypeEnum._3D: type = ParameterType.Texture3D; break;
                //			case Component_Image.TypeEnum.Cube: type = ParameterType.TextureCube; break;
                //			}
                //		}
                //	}
                //}
            }

            //!!!!!check for invalid data

            //ParameterItem parameter = null;

            ////use current parameter or new depending format
            //{
            //	ParameterItem currentItem;
            //	if( parameters.TryGetValue( name, out currentItem ) )
            //	{
            //		if( type == currentItem.type && elementCount == currentItem.elementCount )
            //		{
            //			//!!!!!так?
            //			parameter = currentItem;
            //		}
            //		else
            //			Remove( name );
            //	}
            //}

            ////create parameter
            //if( parameter == null )
            //{
            //	parameter = new ParameterItem();
            //	parameter.container = this;
            //	parameter.name = name;
            //	parameter.type = type;
            //	parameter.elementCount = elementCount;
            //	parameters[ name ] = parameter;
            //}

            var parameter = new NamedParameter();

            parameter.Type         = type;
            parameter.ElementCount = elementCount;

            //update value
            if (ParameterTypeUtility.CanConvertToByteArray(type))
            {
                //prepare data array
                //if( parameter.valueDataPosition == -1 )
                {
                    int needSize = dataUsedBytes + parameter.GetTotalSizeInBytes();

                    if (data == null)
                    {
                        data = new byte[256];
                    }

                    if (needSize > data.Length)
                    {
                        int newSize = data.Length * 2;
                        while (newSize < needSize)
                        {
                            newSize *= 2;
                        }
                        byte[] newData = new byte[newSize];
                        Buffer.BlockCopy(data, 0, newData, 0, dataUsedBytes);
                        data = newData;
                    }

                    parameter.ValueDataPosition = dataUsedBytes;
                    dataUsedBytes += parameter.GetTotalSizeInBytes();
                }

                //copy value
                unsafe
                {
                    fixed(byte *pData = data)
                    {
                        //!!!!slowly

                        if (value.GetType().IsArray)
                        {
                            byte *pDest = pData + parameter.ValueDataPosition;

                            int elementSize = ParameterTypeUtility.GetElementSizeInBytes(parameter.Type);
                            foreach (var item in (IList)value)
                            {
                                Marshal.StructureToPtr(item, (IntPtr)pDest, false);
                                pDest += elementSize;
                            }
                        }
                        else
                        {
                            Marshal.StructureToPtr(value, (IntPtr)(pData + parameter.ValueDataPosition), false);
                        }
                    }
                }
            }
            else
            {
                parameter.ValueReference = value;
            }

            if (NamedParameters == null)
            {
                NamedParameters = new Dictionary <string, NamedParameter>(32);
            }
            NamedParameters[name] = parameter;

            unchecked
            {
                version++;
            }

            //return parameter;
        }