private void UploadTex(CMDL.MTOB.TexInfo TextureMapper, int Id) { if (!(TextureMapper.TextureObject is ReferenceTexture)) { return; } var tex = Resource.Data.Textures[Resource.Data.Dictionaries[1].IndexOf(((ReferenceTexture)TextureMapper.TextureObject).LinkedTextureName)] as ImageTextureCtr; if (tex == null) { return; } Gl.glBindTexture(Gl.GL_TEXTURE_2D, Id); Gl.glColor3f(1, 1, 1); Bitmap b = tex.GetBitmap(); b.RotateFlip(RotateFlipType.RotateNoneFlipY); BitmapData d = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, b.Width, b.Height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, d.Scan0); b.UnlockBits(d); if (((TextureMapper.Unknown12 >> 1) & 1) == 1) { Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR); } else { Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST); } //if (((TextureMapper.Unknown12 >> 2) & 1) == 1) Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR); //else Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST); //A bit confusing, so using this for now: Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR); switch ((TextureMapper.Unknown12 >> 12) & 0xF) { case 0: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_EDGE); break; case 1: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_BORDER); break; case 2: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT); break; case 3: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_MIRRORED_REPEAT); break; default: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT); break; } switch ((TextureMapper.Unknown12 >> 8) & 0xF) { case 0: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_EDGE); break; case 1: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_BORDER); break; case 2: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT); break; case 3: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_MIRRORED_REPEAT); break; default: Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT); break; } }
private CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtr GenMaterialData(CMDL.MTOB mat) { CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtr data = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtr(); data.EditData = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrEditData(); data.EditData.MaterialCopySettingsMedaData = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrEditDataMaterialCopySettingsMedaData(); data.EditData.MaterialCopySettingsMedaData.Key = "MaterialCopySettings"; data.EditData.MaterialCopySettingsMedaData.MaterialCopyFilter = "All"; data.Name = mat.Name; data.IsCompressible = false; // NOT IMPLEMENTED data.LightSetIndex = (byte)mat.LightSetIndex; data.FogIndex = (byte)mat.FogIndex; data.IsFragmentLightEnabled = mat.Flags.HasFlag(CMDL.MTOB.MaterialFlags.FragmentLightEnabled); data.IsVertexLightEnabled = mat.Flags.HasFlag(CMDL.MTOB.MaterialFlags.VertexLightEnabled); data.IsHemiSphereLightEnabled = mat.Flags.HasFlag(CMDL.MTOB.MaterialFlags.HemiSphereLightEnabled); data.IsHemiSphereOcclusionEnabled = mat.Flags.HasFlag(CMDL.MTOB.MaterialFlags.HemiSphereOcclusionEnabled); data.IsFogEnabled = mat.Flags.HasFlag(CMDL.MTOB.MaterialFlags.FogEnabled); string[] TextureCoordinateConfigOpts = { "Config0120", "Config0110", "Config0111", "Config0112", "Config0121", "Config0122", }; data.TextureCoordinateConfig = TextureCoordinateConfigOpts[mat.TexCoordConfig]; string[] TranslucencyKindOpts = { "Layer0", "Layer1", "Layer2", "Layer3" }; data.TranslucencyKind = TranslucencyKindOpts[mat.TranslucencyKind]; data.ShaderProgramDescriptionIndex = (sbyte)mat.ShaderProgramDescriptionIndex; data.ShaderBinaryKind = "Default"; // NOT IMPLEMENTED data.ShaderReference = null; data.MaterialColor = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrMaterialColor(); data.MaterialColor.VertexColorScale = mat.MaterialColor.Ambient.W; data.MaterialColor.Emission = GenColor( mat.MaterialColor.Emission.X, mat.MaterialColor.Emission.Y, mat.MaterialColor.Emission.Z, 0 ); data.MaterialColor.Ambient = GenColor( mat.MaterialColor.Ambient.X, mat.MaterialColor.Ambient.Y, mat.MaterialColor.Ambient.Z, 1 ); data.MaterialColor.Diffuse = GenColor( mat.MaterialColor.Diffuse.X, mat.MaterialColor.Diffuse.Y, mat.MaterialColor.Diffuse.Z, mat.MaterialColor.Diffuse.W ); data.MaterialColor.Specular0 = GenColor( mat.MaterialColor.Specular0.X, mat.MaterialColor.Specular0.Y, mat.MaterialColor.Specular0.Z, mat.MaterialColor.Specular0.W ); data.MaterialColor.Specular1 = GenColor( mat.MaterialColor.Specular1.X, mat.MaterialColor.Specular1.Y, mat.MaterialColor.Specular1.Z, mat.MaterialColor.Specular1.W ); data.MaterialColor.Constant0 = GenColor( mat.MaterialColor.Constant0.X, mat.MaterialColor.Constant0.Y, mat.MaterialColor.Constant0.Z, mat.MaterialColor.Constant0.W ); data.MaterialColor.Constant1 = GenColor( mat.MaterialColor.Constant1.X, mat.MaterialColor.Constant1.Y, mat.MaterialColor.Constant1.Z, mat.MaterialColor.Constant1.W ); data.MaterialColor.Constant2 = GenColor( mat.MaterialColor.Constant2.X, mat.MaterialColor.Constant2.Y, mat.MaterialColor.Constant2.Z, mat.MaterialColor.Constant2.W ); data.MaterialColor.Constant3 = GenColor( mat.MaterialColor.Constant3.X, mat.MaterialColor.Constant3.Y, mat.MaterialColor.Constant3.Z, mat.MaterialColor.Constant3.W ); data.MaterialColor.Constant4 = GenColor( mat.MaterialColor.Constant4.X, mat.MaterialColor.Constant4.Y, mat.MaterialColor.Constant4.Z, mat.MaterialColor.Constant4.W ); data.MaterialColor.Constant5 = GenColor( mat.MaterialColor.Constant5.X, mat.MaterialColor.Constant5.Y, mat.MaterialColor.Constant5.Z, mat.MaterialColor.Constant5.W ); data.Rasterization = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrRasterization(); string[] CullingModeOpts = { "FrontFace", "BackFace", "Always", "Never" }; data.Rasterization.CullingMode = CullingModeOpts[((uint)mat.Rasterization.CullingMode)]; data.Rasterization.IsPolygonOffsetEnabled = mat.Rasterization.Flags.HasFlag(CMDL.MTOB.RasterizationCtr.RasterizationFlags.PolygonOffsetEnabled); data.Rasterization.PolygonOffsetUnit = mat.Rasterization.PolygonOffsetUnit; data.TextureCoordinators = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrTextureCoordinatorCtr[mat.TextureCoordiators.Length]; string[] MappingMethodOpts = { "UvCoordinateMap", "CameraCubeEnvMap", "CameraSphereEnvMap", "ProjectionMap", "" }; string[] MatrixModeOpts = { "DccMaya", "DccSoftimage", "Dcc3dsMax" }; for (int i = 0; i < data.TextureCoordinators.Length; i++) { data.TextureCoordinators[i] = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrTextureCoordinatorCtr(); data.TextureCoordinators[i].SourceCoordinate = (byte)mat.TextureCoordiators[i].SourceCoordinate; data.TextureCoordinators[i].MappingMethod = MappingMethodOpts[((uint)mat.TextureCoordiators[i].MappingMethod)]; data.TextureCoordinators[i].ReferenceCamera = (sbyte)mat.TextureCoordiators[i].ReferenceCamera; data.TextureCoordinators[i].MatrixMode = MatrixModeOpts[(uint)mat.TextureCoordiators[i].MatrixMode]; data.TextureCoordinators[i].ScaleS = mat.TextureCoordiators[i].Scale.X; data.TextureCoordinators[i].ScaleT = mat.TextureCoordiators[i].Scale.Y; data.TextureCoordinators[i].Rotate = mat.TextureCoordiators[i].Rotate; data.TextureCoordinators[i].TranslateS = mat.TextureCoordiators[i].Translate.X; data.TextureCoordinators[i].TranslateT = mat.TextureCoordiators[i].Translate.Y; } uint mapperSize = (mat.Tex0 != null ? 1u : 0u) + (mat.Tex1 != null ? 1u : 0u) + (mat.Tex2 != null ? 1u : 0u); data.TextureMappers = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrPixelBasedTextureMapperCtr[mapperSize]; for (int i = 0; i < mapperSize; i++) { data.TextureMappers[i] = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrPixelBasedTextureMapperCtr(); CMDL.MTOB.TexInfo curr = null; switch (i) { case 0: curr = mat.Tex0; break; case 1: curr = mat.Tex1; break; case 2: curr = mat.Tex2; break; } if (curr.TextureObject != null) { data.TextureMappers[i].TextureReference = "Textures[\"" + (curr.TextureObject as ReferenceTexture).LinkedTextureName + "\"]"; } data.TextureMappers[i].StandardTextureSamplerCtr = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrPixelBasedTextureMapperCtrStandardTextureSamplerCtr(); data.TextureMappers[i].StandardTextureSamplerCtr.MinFilter = Enum.GetName(typeof(CMDL.MTOB.TexInfo.TextureMinFilter), curr.Sampler.MinFilter); CMDL.MTOB.TexInfo.TextureMagFilter magFilter = (CMDL.MTOB.TexInfo.TextureMagFilter)((curr.Unknown12 >> 1) & 1); CMDL.MTOB.TexInfo.TextureWrap wrapV = (CMDL.MTOB.TexInfo.TextureWrap)((curr.Unknown12 >> 8) & 3); CMDL.MTOB.TexInfo.TextureWrap wrapU = (CMDL.MTOB.TexInfo.TextureWrap)((curr.Unknown12 >> 12) & 3); byte minLod = (byte)((curr.Unknown13 >> 24) & 0xf); data.TextureMappers[i].StandardTextureSamplerCtr.MagFilter = Enum.GetName(typeof(CMDL.MTOB.TexInfo.TextureMagFilter), magFilter); data.TextureMappers[i].StandardTextureSamplerCtr.WrapS = Enum.GetName(typeof(CMDL.MTOB.TexInfo.TextureWrap), wrapU); data.TextureMappers[i].StandardTextureSamplerCtr.WrapT = Enum.GetName(typeof(CMDL.MTOB.TexInfo.TextureWrap), wrapV); data.TextureMappers[i].StandardTextureSamplerCtr.MinLod = minLod; data.TextureMappers[i].StandardTextureSamplerCtr.LodBias = (curr.Sampler as CMDL.MTOB.TexInfo.StandardTextureSamplerCtr).LodBias; Vector4 borderColor = (curr.Sampler as CMDL.MTOB.TexInfo.StandardTextureSamplerCtr).BorderColor; data.TextureMappers[i].StandardTextureSamplerCtr.BorderColor = GenColor(borderColor.X, borderColor.Y, borderColor.Z, borderColor.W); } data.FragmentShader = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentShader(); data.FragmentShader.LayerConfig = "ConfigurationType" + mat.FragShader.FragmentLighting.LayerConfig; data.FragmentShader.BufferColor = GenColor(mat.FragShader.BufferColor.X, mat.FragShader.BufferColor.Y, mat.FragShader.BufferColor.Z, mat.FragShader.BufferColor.W); data.FragmentShader.FragmentBump = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentShaderFragmentBump(); data.FragmentShader.FragmentBump.BumpTextureIndex = "Texture" + mat.FragShader.FragmentLighting.BumpTextureIndex; data.FragmentShader.FragmentBump.BumpMode = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.FragmentLightingCtr.FragmentLightingBumpMode), mat.FragShader.FragmentLighting.BumpMode); data.FragmentShader.FragmentBump.IsBumpRenormalize = mat.FragShader.FragmentLighting.IsBumpRenormalize; data.FragmentShader.FragmentLighting = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentShaderFragmentLighting(); string[] FresnelConfigOpts = { "No", "Pri", "Sec", "PriSec" }; data.FragmentShader.FragmentLighting.FresnelConfig = FresnelConfigOpts[mat.FragShader.FragmentLighting.FresnelConfig]; data.FragmentShader.FragmentLighting.IsClampHighLight = mat.FragShader.FragmentLighting.Flags.HasFlag(CMDL.MTOB.FragmentShader.FragmentLightingCtr.FragmentLightingFlags.ClampHighLight); data.FragmentShader.FragmentLighting.IsDistribution0Enabled = mat.FragShader.FragmentLighting.Flags.HasFlag(CMDL.MTOB.FragmentShader.FragmentLightingCtr.FragmentLightingFlags.UseDistribution0); data.FragmentShader.FragmentLighting.IsDistribution1Enabled = mat.FragShader.FragmentLighting.Flags.HasFlag(CMDL.MTOB.FragmentShader.FragmentLightingCtr.FragmentLightingFlags.UseDistribution1); data.FragmentShader.FragmentLighting.IsGeometricFactor0Enabled = mat.FragShader.FragmentLighting.Flags.HasFlag(CMDL.MTOB.FragmentShader.FragmentLightingCtr.FragmentLightingFlags.UseGeometricFactor0); data.FragmentShader.FragmentLighting.IsGeometricFactor1Enabled = mat.FragShader.FragmentLighting.Flags.HasFlag(CMDL.MTOB.FragmentShader.FragmentLightingCtr.FragmentLightingFlags.UseGeometricFactor1); data.FragmentShader.FragmentLighting.IsReflectionEnabled = mat.FragShader.FragmentLighting.Flags.HasFlag(CMDL.MTOB.FragmentShader.FragmentLightingCtr.FragmentLightingFlags.UseReflection); data.FragmentShader.FragmentLightingTable = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentShaderFragmentLightingTable(); data.FragmentShader.FragmentLightingTable.ReflectanceRSampler = GenFragmentTableSampler(mat.FragShader.FragmentLightingTable.ReflectanceRSampler); data.FragmentShader.FragmentLightingTable.ReflectanceGSampler = GenFragmentTableSampler(mat.FragShader.FragmentLightingTable.ReflectanceGSampler); data.FragmentShader.FragmentLightingTable.ReflectanceBSampler = GenFragmentTableSampler(mat.FragShader.FragmentLightingTable.ReflectanceBSampler); data.FragmentShader.FragmentLightingTable.Distribution0Sampler = GenFragmentTableSampler(mat.FragShader.FragmentLightingTable.Distribution0Sampler); data.FragmentShader.FragmentLightingTable.Distribution1Sampler = GenFragmentTableSampler(mat.FragShader.FragmentLightingTable.Distribution1Sampler); data.FragmentShader.FragmentLightingTable.FresnelSampler = GenFragmentTableSampler(mat.FragShader.FragmentLightingTable.FresnelSampler); data.FragmentShader.TextureCombiners = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentShaderTextureCombinerCtr[6]; for (int i = 0; i < 6; i++) { data.FragmentShader.TextureCombiners[i] = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentShaderTextureCombinerCtr(); data.FragmentShader.TextureCombiners[i].CombineRgb = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.Operation), mat.FragShader.TextureCombiners[i].OperationRGB); data.FragmentShader.TextureCombiners[i].CombineAlpha = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.Operation), mat.FragShader.TextureCombiners[i].CombineAlpha); data.FragmentShader.TextureCombiners[i].ScaleRgb = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.Scale), mat.FragShader.TextureCombiners[i].ScalationRGB); data.FragmentShader.TextureCombiners[i].ScaleAlpha = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.Scale), mat.FragShader.TextureCombiners[i].ScalationA); data.FragmentShader.TextureCombiners[i].Constant = "Constant" + mat.FragShader.TextureCombiners[i].Constant; data.FragmentShader.TextureCombiners[i].SourceRgb = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentShaderTextureCombinerCtrSourceRgb(); CMDL.MTOB.FragmentShader.TextureCombinerCtr.Source[] rgbSource = mat.FragShader.TextureCombiners[i].SourcesRGB; data.FragmentShader.TextureCombiners[i].SourceRgb.Source0 = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.Source), rgbSource[0]); data.FragmentShader.TextureCombiners[i].SourceRgb.Source1 = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.Source), rgbSource[1]); data.FragmentShader.TextureCombiners[i].SourceRgb.Source2 = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.Source), rgbSource[2]); data.FragmentShader.TextureCombiners[i].OperandRgb = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentShaderTextureCombinerCtrOperandRgb(); CMDL.MTOB.FragmentShader.TextureCombinerCtr.OperandRGB[] rgbOperand = mat.FragShader.TextureCombiners[i].OperandsRGB; data.FragmentShader.TextureCombiners[i].OperandRgb.Operand0 = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.OperandRGB), rgbOperand[0]); data.FragmentShader.TextureCombiners[i].OperandRgb.Operand1 = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.OperandRGB), rgbOperand[1]); data.FragmentShader.TextureCombiners[i].OperandRgb.Operand2 = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.OperandRGB), rgbOperand[2]); if (i > 1 && i < 5) { data.FragmentShader.TextureCombiners[i - 1].BufferInputRgb = (((mat.FragShader.BufferCommand3 >> (8 + (i - 2))) & 1) != 0) ? "Previous" : "PreviousBuffer"; } data.FragmentShader.TextureCombiners[i].SourceAlpha = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentShaderTextureCombinerCtrSourceAlpha(); CMDL.MTOB.FragmentShader.TextureCombinerCtr.Source[] alphaSource = mat.FragShader.TextureCombiners[i].SourcesA; data.FragmentShader.TextureCombiners[i].SourceAlpha.Source0 = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.Source), alphaSource[0]); data.FragmentShader.TextureCombiners[i].SourceAlpha.Source1 = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.Source), alphaSource[1]); data.FragmentShader.TextureCombiners[i].SourceAlpha.Source2 = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.Source), alphaSource[2]); data.FragmentShader.TextureCombiners[i].OperandAlpha = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentShaderTextureCombinerCtrOperandAlpha(); CMDL.MTOB.FragmentShader.TextureCombinerCtr.OperandAlpha[] alphaOperand = mat.FragShader.TextureCombiners[i].OperandsA; data.FragmentShader.TextureCombiners[i].OperandAlpha.Operand0 = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.OperandAlpha), alphaOperand[0]); data.FragmentShader.TextureCombiners[i].OperandAlpha.Operand1 = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.OperandAlpha), alphaOperand[1]); data.FragmentShader.TextureCombiners[i].OperandAlpha.Operand2 = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.TextureCombinerCtr.OperandAlpha), alphaOperand[2]); if (i > 1 && i < 5) { data.FragmentShader.TextureCombiners[i - 1].BufferInputAlpha = (((mat.FragShader.BufferCommand3 >> (12 + (i - 2))) & 1) != 0) ? "Previous" : "PreviousBuffer"; } } data.FragmentShader.TextureCombiners[0].BufferInputRgb = "PreviousBuffer"; data.FragmentShader.TextureCombiners[4].BufferInputRgb = "PreviousBuffer"; data.FragmentShader.TextureCombiners[5].BufferInputRgb = "PreviousBuffer"; data.FragmentShader.TextureCombiners[0].BufferInputAlpha = "PreviousBuffer"; data.FragmentShader.TextureCombiners[4].BufferInputAlpha = "PreviousBuffer"; data.FragmentShader.TextureCombiners[5].BufferInputAlpha = "PreviousBuffer"; data.FragmentShader.AlphaTest = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentShaderAlphaTest(); data.FragmentShader.AlphaTest.IsTestEnabled = mat.FragShader.AlphaTest.AlphaTestEnabled; data.FragmentShader.AlphaTest.TestFunction = Enum.GetName(typeof(CMDL.MTOB.FragmentShader.AlphaTestCtr.AlphaTestOperation), mat.FragShader.AlphaTest.TestFunction); data.FragmentShader.AlphaTest.TestReference = mat.FragShader.AlphaTest.TestReference; data.FragmentOperation = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentOperation(); data.FragmentOperation.DepthOperation = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentOperationDepthOperation(); data.FragmentOperation.DepthOperation.IsTestEnabled = mat.FragmentOperation.DepthOperation.Flags.HasFlag(CMDL.MTOB.FragmentOperationCtr.DepthOperationCtr.DepthFlags.TestEnabled); data.FragmentOperation.DepthOperation.IsMaskEnabled = mat.FragmentOperation.DepthOperation.Flags.HasFlag(CMDL.MTOB.FragmentOperationCtr.DepthOperationCtr.DepthFlags.MaskEnabled); data.FragmentOperation.DepthOperation.TestFunction = Enum.GetName(typeof(CMDL.MTOB.FragmentOperationCtr.DepthOperationCtr.DepthTestOperation), mat.FragmentOperation.DepthOperation.Operation); data.FragmentOperation.BlendOperation = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentOperationBlendOperation(); data.FragmentOperation.BlendOperation.Mode = Enum.GetName(typeof(CMDL.MTOB.FragmentOperationCtr.BlendOperationCtr.BlendModes), mat.FragmentOperation.BlendOperation.BlendMode); data.FragmentOperation.BlendOperation.LogicOperation = Enum.GetName(typeof(CMDL.MTOB.FragmentOperationCtr.BlendOperationCtr.LogicOperations), mat.FragmentOperation.BlendOperation.LogicOperation); data.FragmentOperation.BlendOperation.RgbParameter = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentOperationBlendOperationRgbParameter(); data.FragmentOperation.BlendOperation.RgbParameter.BlendFunctionSource = Enum.GetName(typeof(CMDL.MTOB.FragmentOperationCtr.BlendOperationCtr.BlendFactor), mat.FragmentOperation.BlendOperation.ColorSource); data.FragmentOperation.BlendOperation.RgbParameter.BlendFunctionDestination = Enum.GetName(typeof(CMDL.MTOB.FragmentOperationCtr.BlendOperationCtr.BlendFactor), mat.FragmentOperation.BlendOperation.ColorDest); data.FragmentOperation.BlendOperation.RgbParameter.BlendEquation = Enum.GetName(typeof(CMDL.MTOB.FragmentOperationCtr.BlendOperationCtr.BlendEquations), mat.FragmentOperation.BlendOperation.BlendEquationColor); // Alpha blending settings unused? data.FragmentOperation.BlendOperation.AlphaParameter = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentOperationBlendOperationAlphaParameter(); data.FragmentOperation.BlendOperation.AlphaParameter.BlendFunctionSource = Enum.GetName(typeof(CMDL.MTOB.FragmentOperationCtr.BlendOperationCtr.BlendFactor), mat.FragmentOperation.BlendOperation.AlphaSource); data.FragmentOperation.BlendOperation.AlphaParameter.BlendFunctionDestination = Enum.GetName(typeof(CMDL.MTOB.FragmentOperationCtr.BlendOperationCtr.BlendFactor), mat.FragmentOperation.BlendOperation.AlphaDest); data.FragmentOperation.BlendOperation.AlphaParameter.BlendEquation = Enum.GetName(typeof(CMDL.MTOB.FragmentOperationCtr.BlendOperationCtr.BlendEquations), mat.FragmentOperation.BlendOperation.BlendEquationAlpha); data.FragmentOperation.BlendOperation.BlendColor = GenColor( mat.FragmentOperation.BlendOperation.BlendColor.X, mat.FragmentOperation.BlendOperation.BlendColor.Y, mat.FragmentOperation.BlendOperation.BlendColor.Z, mat.FragmentOperation.BlendOperation.BlendColor.W ); // Stencil operation unused? data.FragmentOperation.StencilOperation = new CMAT.NintendoWareIntermediateFileGraphicsContentCtrMaterialsMaterialCtrFragmentOperationStencilOperation(); data.FragmentOperation.StencilOperation.IsTestEnabled = false; data.FragmentOperation.StencilOperation.TestFunction = "Always"; data.FragmentOperation.StencilOperation.TestReference = 0; data.FragmentOperation.StencilOperation.TestMask = 255; data.FragmentOperation.StencilOperation.FailOperation = "Keep"; data.FragmentOperation.StencilOperation.ZFailOperation = "Keep"; data.FragmentOperation.StencilOperation.PassOperation = "Keep"; return(data); }
private void UploadTex(CMDL.MTOB.TexInfo TextureMapper, int Id) { if (!(TextureMapper.TextureObject is ReferenceTexture)) { return; } var tex = Resource.Data.Textures[Resource.Data.Dictionaries[1].IndexOf(((ReferenceTexture)TextureMapper.TextureObject).LinkedTextureName)] as ImageTextureCtr; if (tex == null) { return; } GL.BindTexture(TextureTarget.Texture2D, Id); GL.Color3(1, 1, 1); Bitmap b = tex.GetBitmap(); b.RotateFlip(RotateFlipType.RotateNoneFlipY); BitmapData d = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, b.Width, b.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, d.Scan0); b.UnlockBits(d); if (((TextureMapper.Unknown12 >> 1) & 1) == 1) { GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); } else { GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); } //if (((TextureMapper.Unknown12 >> 2) & 1) == 1) GL.glTexParameteri(TextureTarget.Texture2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); //else GL.glTexParameteri(TextureTarget.Texture2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST); //A bit confusing, so using this for now: GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); switch ((TextureMapper.Unknown12 >> 12) & 0xF) { case 0: GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge); break; case 1: GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToBorder); break; case 2: GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat); break; case 3: GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.MirroredRepeat); break; default: GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat); break; } switch ((TextureMapper.Unknown12 >> 8) & 0xF) { case 0: GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge); break; case 1: GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToBorder); break; case 2: GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat); break; case 3: GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.MirroredRepeat); break; default: GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat); break; } }