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; }
public MDL0MaterialNode() { _normMapRefLight1 = _normMapRefLight2 = _normMapRefLight3 = _normMapRefLight4 = -1; _numLights = 1; _chan1 = new LightChannel(63, new RGBAPixel(255, 255, 255, 255), new RGBAPixel(255, 255, 255, 255), 0, 0, this); _chan2 = new LightChannel(15, new RGBAPixel(0, 0, 0, 255), new RGBAPixel(), 0, 0, this); }
public override bool OnInitialize() { MDL0Material* header = Header; _initVersion = header->_pad != 0 && _replaced ? header->_pad : Model._version; if ((_name == null) && (header->_stringOffset != 0)) _name = header->ResourceString; XFCmds.Clear(); //Get XF Commands byte* pData = (byte*)header->DisplayLists(Model._version) + 0xE0; Top: if (*pData++ == 0x10) { XFData dat = new XFData(); int count = (ushort)*(bushort*)pData; pData += 2; dat.addr = (XFMemoryAddr)(ushort)*(bushort*)pData; pData += 2; dat.values = new List<uint>(); for (int i = 0; i < count + 1; i++) { dat.values.Add(*(buint*)pData); pData += 4; } XFCmds.Add(dat); goto Top; } _mdl0Offset = header->_mdl0Offset; _stringOffset = header->_stringOffset; _userDataOffset = header->UserDataOffset(_initVersion); _shaderOffset = header->_shaderOffset; _dlOffset = header->DisplayListOffset(_initVersion); _furDataOffset = header->FurDataOffset(_initVersion); _matRefOffset = header->_matRefOffset; _pad = header->_pad; _dataLen = header->_dataLen; _numTextures = header->_numTexGens; _numLights = header->_numLightChans; _usageFlags = new Bin32(header->_usageFlags); _indirectMethod1 = header->_indirectMethod1; _indirectMethod2 = header->_indirectMethod2; _indirectMethod3 = header->_indirectMethod3; _indirectMethod4 = header->_indirectMethod4; _normMapRefLight1 = header->_normMapRefLight1; _normMapRefLight2 = header->_normMapRefLight2; _normMapRefLight3 = header->_normMapRefLight3; _normMapRefLight4 = header->_normMapRefLight4; _ssc = header->_activeTEVStages; _clip = header->_numIndTexStages; _transp = header->_enableAlphaTest; _lSet = header->_lightSet; _fSet = header->_fogSet; _cull = (CullMode)(int)header->_cull; if ((-header->_mdl0Offset + (int)header->DisplayListOffset(_initVersion)) % 0x20 != 0) { Model._errors.Add("Material " + Index + " has an improper align offset."); SignalPropertyChange(); } mode = header->DisplayLists(_initVersion); _alphaFunc = mode->AlphaFunction; _zMode = mode->ZMode; _blendMode = mode->BlendMode; _constantAlpha = mode->ConstantAlpha; _tevColorBlock = *header->TevColorBlock(_initVersion); _tevKonstBlock = *header->TevKonstBlock(_initVersion); _indMtx = *header->IndMtxBlock(_initVersion); MDL0TexSRTData* TexMatrices = header->TexMatrices(_initVersion); _layerFlags = TexMatrices->_layerFlags; _texMtxFlags = TexMatrices->_mtxFlags; MDL0MaterialLighting* Light = header->Light(_initVersion); (_chan1 = Light->Channel1)._parent = this; (_chan2 = Light->Channel2)._parent = this; c1 = CReg2Color; c2 = CReg2Color; c3 = CReg2Color; k1 = KReg0Color; k2 = KReg1Color; k3 = KReg2Color; k3 = KReg3Color; clr1 = C1MaterialColor; clr2 = C2MaterialColor; amb1 = C1AmbientColor; amb2 = C2AmbientColor; (_userEntries = new UserDataCollection()).Read(header->UserData(_initVersion)); return true; }