public void CheckMetals() { if (_autoMetal) { if (MessageBox.Show(null, "Are you sure you want to turn this on?\nAny existing metal materials will be modified.", "", MessageBoxButtons.YesNo) == DialogResult.Yes) { if (_children == null) Populate(); for (int x = 0; x < _matList.Count; x++) { MDL0MaterialNode n = (MDL0MaterialNode)_matList[x]; if (!n.isMetal) { if (n.MetalMaterial == null) { MDL0MaterialNode node = new MDL0MaterialNode(); _matGroup.AddChild(node); node._updating = true; node.Name = n.Name + "_ExtMtl"; node._ssc = 4; node.New = true; for (int i = 0; i <= n.Children.Count; i++) { MDL0MaterialRefNode mr = new MDL0MaterialRefNode(); node.AddChild(mr); mr.Texture = "metal00"; mr._index1 = mr._index2 = i; mr.SignalPropertyChange(); if (i == n.Children.Count || ((MDL0MaterialRefNode)n.Children[i]).HasTextureMatrix) { mr._minFltr = 5; mr._magFltr = 1; mr._lodBias = -2; mr.HasTextureMatrix = true; node.Rebuild(true); mr._projection = (int)TexProjection.STQ; mr._inputForm = (int)TexInputForm.ABC1; mr._texGenType = (int)TexTexgenType.Regular; mr._sourceRow = (int)TexSourceRow.Normals; mr._embossSource = 4; mr._embossLight = 2; mr.Normalize = true; mr.MapMode = (MDL0MaterialRefNode.MappingMethod)1; mr.getTexMtxVal(); break; } } node._chan1 = new LightChannel(63, new RGBAPixel(128, 128, 128, 255), new RGBAPixel(255, 255, 255, 255), 0, 0, node); node.C1ColorEnabled = true; node.C1ColorDiffuseFunction = GXDiffuseFn.Clamped; node.C1ColorAttenuation = GXAttnFn.Spotlight; node.C1AlphaEnabled = true; node.C1AlphaDiffuseFunction = GXDiffuseFn.Clamped; node.C1AlphaAttenuation = GXAttnFn.Spotlight; node._chan2 = new LightChannel(63, new RGBAPixel(255, 255, 255, 255), new RGBAPixel(), 0, 0, node); node.C2ColorEnabled = true; node.C2ColorDiffuseFunction = GXDiffuseFn.Disabled; node.C2ColorAttenuation = GXAttnFn.Specular; node.C2AlphaDiffuseFunction = GXDiffuseFn.Disabled; node.C2AlphaAttenuation = GXAttnFn.Specular; node._lSet = n._lSet; node._fSet = n._fSet; node._cull = n._cull; node._numLights = 2; node.ZCompareLoc = false; node._normMapRefLight1 = node._normMapRefLight2 = node._normMapRefLight3 = node._normMapRefLight4 = -1; node.SignalPropertyChange(); } } } foreach (MDL0MaterialNode node in _matList) { if (!node.isMetal) continue; if (node.ShaderNode != null) { if (node.ShaderNode._autoMetal && node.ShaderNode.texCount == node.Children.Count) { node._updating = false; continue; } else { if (node.ShaderNode._stages == 4) { foreach (MDL0MaterialNode y in node.ShaderNode._materials) if (!y.isMetal || y.Children.Count != node.Children.Count) goto Next; node.ShaderNode.DefaultAsMetal(node.Children.Count); continue; } } } Next: bool found = false; foreach (MDL0ShaderNode s in _shadGroup.Children) { if (s._autoMetal && s.texCount == node.Children.Count) { node.ShaderNode = s; found = true; } else { if (s._stages == 4) { foreach (MDL0MaterialNode y in s._materials) if (!y.isMetal || y.Children.Count != node.Children.Count) goto NotFound; node.ShaderNode = s; found = true; goto End; NotFound: continue; } } } End: if (!found) { MDL0ShaderNode shader = new MDL0ShaderNode(); _shadGroup.AddChild(shader); shader.DefaultAsMetal(node.Children.Count); node.ShaderNode = shader; } } foreach (MDL0MaterialNode m in _matList) m._updating = false; } else _autoMetal = false; } }
public void UpdateAsMetal() { if (!isMetal) return; _updating = true; if (ShaderNode != null && ShaderNode._autoMetal && ShaderNode.texCount == Children.Count) { //ShaderNode.DefaultAsMetal(Children.Count); } else { bool found = false; foreach (MDL0ShaderNode s in Model._shadGroup.Children) { if (s._autoMetal && s.texCount == Children.Count) { ShaderNode = s; found = true; } else { if (s._stages == 4) { foreach (MDL0MaterialNode y in s._materials) if (!y.isMetal || y.Children.Count != Children.Count) goto NotFound; ShaderNode = s; found = true; goto End; NotFound: continue; } } } End: if (!found) { MDL0ShaderNode shader = new MDL0ShaderNode(); Model._shadGroup.AddChild(shader); shader.DefaultAsMetal(Children.Count); ShaderNode = shader; } } if (MetalMaterial != null) { Name = MetalMaterial.Name + "_ExtMtl"; _ssc = 4; if (Children.Count - 1 != MetalMaterial.Children.Count) { //Remove all children for (int i = 0; i < Children.Count; i++) { ((MDL0MaterialRefNode)Children[i]).TextureNode = null; ((MDL0MaterialRefNode)Children[i]).PaletteNode = null; RemoveChild(Children[i--]); } //Start over for (int i = 0; i <= MetalMaterial.Children.Count; i++) { MDL0MaterialRefNode mr = new MDL0MaterialRefNode(); AddChild(mr); mr.Texture = "metal00"; mr._index1 = mr._index2 = i; mr._texFlags.TexScale = new Vector2(1); mr._bindState._scale = new Vector3(1); mr._texMatrix.TexMtx = Matrix43.Identity; mr._texMatrix.SCNCamera = -1; mr._texMatrix.SCNLight = -1; mr._texMatrix.Identity = 1; if (i == MetalMaterial.Children.Count) { mr._minFltr = 5; mr._magFltr = 1; mr._lodBias = -2; mr.HasTextureMatrix = true; mr._projection = (int)TexProjection.STQ; mr._inputForm = (int)TexInputForm.ABC1; mr._sourceRow = (int)TexSourceRow.Normals; mr.Normalize = true; mr.MapMode = (MDL0MaterialRefNode.MappingMethod)1; } else { mr._projection = (int)TexProjection.ST; mr._inputForm = (int)TexInputForm.AB11; mr._sourceRow = (int)TexSourceRow.TexCoord0 + i; mr.Normalize = false; mr.MapMode = (MDL0MaterialRefNode.MappingMethod)0; } mr._texGenType = (int)TexTexgenType.Regular; mr._embossSource = 4; mr._embossLight = 2; mr.getTexMtxVal(); } _chan1 = new LightChannel(63, new RGBAPixel(128, 128, 128, 255), new RGBAPixel(255, 255, 255, 255), 0, 0, this); C1ColorEnabled = true; C1ColorDiffuseFunction = GXDiffuseFn.Clamped; C1ColorAttenuation = GXAttnFn.Spotlight; C1AlphaEnabled = true; C1AlphaDiffuseFunction = GXDiffuseFn.Clamped; C1AlphaAttenuation = GXAttnFn.Spotlight; _chan2 = new LightChannel(63, new RGBAPixel(255, 255, 255, 255), new RGBAPixel(), 0, 0, this); C2ColorEnabled = true; C2ColorDiffuseFunction = GXDiffuseFn.Disabled; C2ColorAttenuation = GXAttnFn.Specular; C2AlphaDiffuseFunction = GXDiffuseFn.Disabled; C2AlphaAttenuation = GXAttnFn.Specular; _lSet = MetalMaterial._lSet; _fSet = MetalMaterial._fSet; _cull = MetalMaterial._cull; _numLights = 2; ZCompareLoc = false; _normMapRefLight1 = _normMapRefLight2 = _normMapRefLight3 = _normMapRefLight4 = -1; SignalPropertyChange(); } } _updating = false; }