internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("COLOR", "float4 color", Format.R8G8B8A8_UNorm, component, list, dict, declaration, code);

            code.AppendLine("__color = input.color;");
        }
        internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("POSITION", "float3 position", Format.R16G16B16A16_Float, component, list, dict, declaration, code);

            code.AppendLine("result.position_local_raw = float4(input.position, 1);");
        }
        internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("BLENDWEIGHT", "float4 blend_weights", Format.R16G16B16A16_Float, component, list, dict, declaration, code);

            code.AppendLine("__blend_weights = input.blend_weights;");
        }
        internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("BLENDINDICES", "uint4 blend_indices", Format.R8G8B8A8_UInt, component, list, dict, declaration, code);

            code.AppendLine("__blend_indices = input.blend_indices;");
        }
        internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("POSITION", "float4 position", Format.R16G16B16A16_Float, component, list, dict, declaration, code);

            code.AppendLine("__position_object = unpack_position_and_scale(input.position);");
        }
        internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("POSITION", "float3 position", Format.R32G32B32_Float, component, list, dict, declaration, code);

            code.AppendLine("__position_object = float4(input.position, 1);");
        }
        protected static void AddSingle(string name, string variable, Format format, MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict, StringBuilder declaration)
        {
            var classification = component.Freq == MyVertexInputComponentFreq.PER_VERTEX ? InputClassification.PerVertexData : InputClassification.PerInstanceData;
            var freq = component.Freq == MyVertexInputComponentFreq.PER_VERTEX ? 0 : 1;
            var index = NextIndex(dict, name);

            list.Add(new InputElement(name, index, format, InputElement.AppendAligned, component.Slot, classification, freq));
            declaration.AppendFormat("{0} : {1}{2};\\\n", variable, name, index);
        }
 public int CompareTo(MyVertexInputComponent item)
 {
     if (Type == item.Type)
     {
         if (Slot == item.Slot)
         {
             return Freq - item.Freq;
         }
         return Slot - item.Slot;
     }
     else return Type - item.Type;
 }
        internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("NORMAL", "float4 normal", Format.R8G8B8A8_UNorm, component, list, dict, declaration, code);

            code.AppendLine("__normal = unpack_normal(input.normal);");
        }
 internal abstract void AddComponent(MyVertexInputComponent component,
     List<InputElement> list, Dictionary<string, int> dict,
     StringBuilder declaration, StringBuilder code);
        internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("POSITION", "float4 position", Format.R16G16B16A16_UNorm, component, list, dict, declaration, code);

            code.AppendLine("result.position_local_raw = unpack_voxel_position(input.position);");
            code.AppendLine("result.material_weights = unpack_voxel_weights(input.position.w);");
        }
        internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("TEXCOORD", "float4 packed_bone0", Format.R8G8B8A8_UNorm, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 packed_bone1", Format.R8G8B8A8_UNorm, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 packed_bone2", Format.R8G8B8A8_UNorm, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 packed_bone3", Format.R8G8B8A8_UNorm, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 packed_bone4", Format.R8G8B8A8_UNorm, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 packed_bone5", Format.R8G8B8A8_UNorm, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 packed_bone6", Format.R8G8B8A8_UNorm, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 packed_bone7", Format.R8G8B8A8_UNorm, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 cube_transformation", Format.R16G16B16A16_Float, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 colormask", Format.R16G16B16A16_Float, component, list, dict, declaration, code);

            code.AppendLine("__packed_bone0 = input.packed_bone0;");
            code.AppendLine("__packed_bone1 = input.packed_bone1;");
            code.AppendLine("__packed_bone2 = input.packed_bone2;");
            code.AppendLine("__packed_bone3 = input.packed_bone3;");
            code.AppendLine("__packed_bone4 = input.packed_bone4;");
            code.AppendLine("__packed_bone5 = input.packed_bone5;");
            code.AppendLine("__packed_bone6 = input.packed_bone6;");
            code.AppendLine("__packed_bone7 = input.packed_bone7;");
            code.AppendLine("__cube_transformation = input.cube_transformation;");
            code.AppendLine("__colormask = input.colormask;");
        }
        internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("TEXCOORD", "float4 matrix_row0", Format.R16G16B16A16_Float, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 matrix_row1", Format.R16G16B16A16_Float, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 matrix_row2", Format.R16G16B16A16_Float, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 colormask", Format.R16G16B16A16_Float, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float2 uvOffset", Format.R16G16B16A16_Float, component, list, dict, declaration, code);

            code.AppendLine("__instance_matrix = construct_matrix_43( input.matrix_row0, input.matrix_row1, input.matrix_row2);");
            code.AppendLine("__colormask = input.colormask;");
            code.AppendLine("__uvOffset = input.uvOffset;");
        }
 internal override void AddComponent(MyVertexInputComponent component,
     List<InputElement> list, Dictionary<string, int> dict,
     StringBuilder declaration, StringBuilder code)
 {
     AddSingle("TEXCOORD", "float4 custom_unorm4_1", Format.R8G8B8A8_UNorm, component, list, dict, declaration, code);
 }
        internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("TEXCOORD", "uint4 texIndices", Format.R8G8B8A8_UInt, component, list, dict, declaration);

            code.Append("__texIndices = (float4) input.texIndices;\\\n");
        }
 internal MyVertexInputLayout Append(MyVertexInputComponent component)
 {
     return Append(component.Type, component.Slot, component.Freq);
 }
        internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("POSITION", "float4 position", Format.R16G16B16A16_UNorm, component, list, dict, declaration, code);
            AddSingle("POSITION", "float4 position_morph", Format.R16G16B16A16_UNorm, component, list, dict, declaration, code);

            code.AppendLine("__position_object = unpack_voxel_position(input.position);");
            code.AppendLine("__material_weights = unpack_voxel_weights(input.position.w);");
            code.AppendLine("__ambient_occlusion = unpack_voxel_ao(input.position.w);");
            code.AppendLine("__position_object_morph = unpack_voxel_position(input.position_morph);");
            code.AppendLine("__material_weights_morph = unpack_voxel_weights(input.position_morph.w);");
            code.AppendLine("__ambient_occlusion_morph = unpack_voxel_ao(input.position_morph.w);");
        }
        internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("TEXCOORD", "float2 texcoord0", Format.R32G32_Float, component, list, dict, declaration, code);

            code.AppendLine("__texcoord0 = input.texcoord0;");
        }
        internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("TANGENT", "float4 tangent4", Format.R8G8B8A8_UNorm, component, list, dict, declaration, code);

            code.AppendLine("__tangent = unpack_tangent_sign(input.tangent4);");
        }
 internal override void AddComponent(MyVertexInputComponent component,
     List<InputElement> list, Dictionary<string, int> dict,
     StringBuilder declaration, StringBuilder code)
 {
     AddSingle("TEXCOORD", "float4 custom_half4_2", Format.R16G16B16A16_Float, component, list, dict, declaration, code);
 }
        internal MyVertexInputLayout Append(MyVertexInputComponentType type, int slot = 0, MyVertexInputComponentFreq freq = MyVertexInputComponentFreq.PER_VERTEX)
        {
            MyVertexInputComponent component = new MyVertexInputComponent();
            component.Type = type;
            component.Slot = slot;
            component.Freq = freq;

            int nextHash = MyHashHelper.Combine(m_hash, component.GetHashCode());

            MyVertexInputLayout next;
            if(m_cached.TryGetValue(nextHash, out next))
            {
                return next;
            }

            next = new MyVertexInputLayout();
            next.m_hash = nextHash;
            next.m_id = m_cached.Count;
            next.m_components = m_components.Concat(component.Yield()).ToArray();
            next.Build();

            m_cached[nextHash] = next;
            return next;
        }
        internal override void AddComponent(MyVertexInputComponent component,
            List<InputElement> list, Dictionary<string, int> dict,
            StringBuilder declaration, StringBuilder code)
        {
            AddSingle("TEXCOORD", "float4 matrix_row0", Format.R16G16B16A16_Float, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 matrix_row1", Format.R16G16B16A16_Float, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 matrix_row2", Format.R16G16B16A16_Float, component, list, dict, declaration, code);
            AddSingle("TEXCOORD", "float4 color_mask_hsv", Format.R16G16B16A16_Float, component, list, dict, declaration, code);

            code.AppendLine("result.matrix_row0 = input.matrix_row0;");
            code.AppendLine("result.matrix_row1 = input.matrix_row1;");
            code.AppendLine("result.matrix_row2 = input.matrix_row2;");
        }