示例#1
0
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            RGBAPixel p = new RGBAPixel();

            string s = value.ToString();

            string[] arr = s.Split(delims, StringSplitOptions.RemoveEmptyEntries);

            if (arr.Length == 4)
            {
                byte.TryParse(arr[0], out p.R);
                byte.TryParse(arr[1], out p.G);
                byte.TryParse(arr[2], out p.B);
                byte.TryParse(arr[3], out p.A);
            }

            d.Color = Color.FromArgb(p.A, p.R, p.G, p.B);
            if (!d.Visible && d.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                p = new RGBAPixel()
                {
                    R = d.Color.R, G = d.Color.G, B = d.Color.B, A = d.Color.A
                }
            }
            ;

            return(p);
        }
    }
示例#2
0
        private List <ARGBPixel> GetCopiedPixels()
        {
            List <ARGBPixel> pixels = new List <ARGBPixel>();
            string           s      = Clipboard.GetText();

            string[] str = s.Split('\r', '\n').Where(x => !string.IsNullOrEmpty(x)).ToArray();
            for (int i = 0; i < str.Length; i++)
            {
                int x = 0;
                s = "";
                foreach (char c in str[i])
                {
                    if (_allowed.IndexOf(c) >= 0)
                    {
                        s += c;
                        x++;
                    }
                    if (x >= 8)
                    {
                        break;
                    }
                }

                pixels.Add(RGBAPixel.Parse(s));
            }
            return(pixels);
        }
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            RGBAPixel p = new RGBAPixel();

            string s = value?.ToString() ?? "";

            string[] arr = s.Split(Delims, StringSplitOptions.RemoveEmptyEntries);

            if (arr.Length == 4)
            {
                byte.TryParse(arr[0], out p.R);
                byte.TryParse(arr[1], out p.G);
                byte.TryParse(arr[2], out p.B);
                byte.TryParse(arr[3], out p.A);
            }
            else if (arr.Length == 1 && byte.TryParse(arr[0], out byte px))
            {
                p.R = px;
                p.G = px;
                p.B = px;
                p.A = px;
            }

            return(p);
        }
 protected void ReadColors(
     uint flags,
     uint bit,
     ref RGBAPixel solidColor,
     ref List <RGBAPixel> colors,
     int frameCount,
     VoidPtr address,
     ref bool constant,
     ref int numEntries)
 {
     colors = new List <RGBAPixel>();
     if (constant = (flags & bit) != 0)
     {
         solidColor = *(RGBAPixel *)address;
         numEntries = 0;
     }
     else
     {
         numEntries = frameCount + 1;
         RGBAPixel *addr = (RGBAPixel *)(address + *(bint *)address);
         for (int x = 0; x < numEntries; x++)
         {
             colors.Add(*addr++);
         }
     }
 }
示例#5
0
 public void MakeSolid(RGBAPixel color)
 {
     _numEntries    = 0;
     _constantColor = true;
     _solidColor    = color;
     SignalPropertyChange();
 }
示例#6
0
 public void SetColor(int index, int id, ARGBPixel color)
 {
     if (_numEntries == 0)
     {
         _solidColor = (RGBAPixel)color;
     }
     else
     {
         _colors[index] = (RGBAPixel)color;
     }
     SignalPropertyChange();
 }
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            base.OnRebuild(address, length, force);

            _matchAddr = null;

            SCN0AmbientLight *header = (SCN0AmbientLight *)address;

            header->_header._length = _length = SCN0AmbientLight.Size;

            if (_name != "<null>")
            {
                header->_fixedFlags = 128;
                header->_pad1       = 0;
                header->_pad2       = 0;
                header->_flags      = usageFlags;
                if (_numEntries != 0)
                {
                    header->_fixedFlags = 0;

                    _matchAddr = lightAddr;
                    if (_match == null)
                    {
                        *((bint *)header->_lighting.Address) = (int)lightAddr - (int)header->_lighting.Address;
                        for (int i = 0; i <= ((SCN0Node)Parent.Parent).FrameCount; i++)
                        {
                            if (i < _colors.Count)
                            {
                                *lightAddr++ = (RGBAPixel)_colors[i];
                            }
                            else
                            {
                                *lightAddr++ = new RGBAPixel();
                            }
                        }
                    }
                    else
                    {
                        *((bint *)header->_lighting.Address) = (int)_match._matchAddr - (int)header->_lighting.Address;
                    }
                }
                else
                {
                    header->_lighting = (RGBAPixel)_solidColor;
                }
            }
        }
 public int WriteColors(ref int flags,
                        int bit,
                        RGBAPixel solidColor,
                        List <RGBAPixel> colors,
                        bool constant,
                        int frameCount,
                        VoidPtr valueAddr,
                        ref VoidPtr thisMatchAddr,
                        VoidPtr thatMatchAddr,
                        RGBAPixel *dataAddr)
 {
     if (!constant)
     {
         flags        &= ~bit;
         thisMatchAddr = dataAddr;
         if (thatMatchAddr == null)
         {
             VoidPtr start = dataAddr;
             *((bint *)valueAddr) = (int)dataAddr - (int)valueAddr;
             for (int x = 0; x <= frameCount; x++)
             {
                 if (x < colors.Count)
                 {
                     *dataAddr++ = colors[x];
                 }
                 else
                 {
                     *dataAddr++ = new RGBAPixel();
                 }
             }
             return((int)(dataAddr - start));
         }
         else
         {
             *((bint *)valueAddr) = (int)thatMatchAddr - (int)valueAddr;
             return(0);
         }
     }
     else
     {
         flags |= bit;
         *((RGBAPixel *)valueAddr) = solidColor;
         return(0);
     }
 }
示例#9
0
        /*
         *  w("{0}float4 " + I_POSNORMALMATRIX + "[6];\n", WriteLocation(ctx));
         *  w("{0}float4 " + I_PROJECTION + "[4];\n", WriteLocation(ctx));
         *  w("{0}float4 " + I_MATERIALS + "[4];\n", WriteLocation(ctx));
         *  w("{0}float4 " + I_LIGHTS + "[40];\n", WriteLocation(ctx));
         *
         *  //Tex effect matrices
         *  w("{0}float4 " + I_TEXMATRICES + "[24];\n", WriteLocation(ctx)); // also using tex matrices
         *
         *  w("{0}float4 " + I_TRANSFORMMATRICES + "[64];\n", WriteLocation(ctx));
         *  w("{0}float4 " + I_NORMALMATRICES + "[32];\n", WriteLocation(ctx));
         *  w("{0}float4 " + I_POSTTRANSFORMMATRICES + "[64];\n", WriteLocation(ctx));
         *      w("{0}float4 " + I_DEPTHPARAMS + ";\n", WriteLocation(ctx));
         *
         *  //24
         *  //16
         *  //16
         *  //160
         *  //96
         *  //256
         *  //128
         *  //256
         *  //4
         */
        public void SetLightUniforms(int programHandle)
        {
            int currUniform = GL.GetUniformLocation(programHandle, I_LIGHTS);

            if (currUniform > -1)
            {
                int          frame  = UsableMaterialNode.renderFrame;
                List <float> values = new List <float>();
                foreach (SCN0LightNode l in UsableMaterialNode._lightSet._lights)
                {
                    //float4 col; float4 cosatt; float4 distatt; float4 pos; float4 dir;

                    RGBAPixel p = (RGBAPixel)l.GetColor(frame, 0);
                    values.Add((float)p.R * RGBAPixel.ColorFactor);
                    values.Add((float)p.G * RGBAPixel.ColorFactor);
                    values.Add((float)p.B * RGBAPixel.ColorFactor);
                    values.Add((float)p.A * RGBAPixel.ColorFactor);
                    Vector3 v = l.GetLightSpot(frame);
                    values.Add(v._x);
                    values.Add(v._y);
                    values.Add(v._z);
                    values.Add(1.0f);
                    v = l.GetLightDistAttn(frame);
                    values.Add(v._x);
                    values.Add(v._y);
                    values.Add(v._z);
                    values.Add(1.0f);
                    v = l.GetStart(frame);
                    values.Add(v._x);
                    values.Add(v._y);
                    values.Add(v._z);
                    values.Add(1.0f);
                    Vector3 v2  = l.GetEnd(frame);
                    Vector3 dir = Matrix.AxisAngleMatrix(v, v2).GetAngles();
                    values.Add(dir._x);
                    values.Add(dir._y);
                    values.Add(dir._z);
                    values.Add(1.0f);
                }

                GL.Uniform4(currUniform, 40, values.ToArray());
            }
        }
        protected internal override void OnRebuild(VoidPtr address, int length, bool force)
        {
            base.OnRebuild(address, length, force);

            SCN0AmbientLight *header = (SCN0AmbientLight *)address;

            if (_name != "<null>")
            {
                header->_fixedFlags = fixedFlags;
                header->_unk2       = 0;
                header->_unk3       = 0;
                header->_unk4       = unk4;
                if (_lighting.Count > 1)
                {
                    *((bint *)header->_lighting.Address) = (int)lightAddr - (int)header->_lighting.Address;
                    for (int i = 0; i <= ((SCN0Node)Parent.Parent).FrameCount; i++)
                    {
                        if (i < _lighting.Count)
                        {
                            *lightAddr++ = _lighting[i];
                        }
                        else
                        {
                            *lightAddr++ = new RGBAPixel();
                        }
                    }
                }
                else if (_lighting.Count == 1)
                {
                    header->_lighting = _lighting[0];
                }
                else
                {
                    header->_lighting = new RGBAPixel();
                }
            }
        }
示例#11
0
        protected void ReadPixelData(BinaryReader reader, Frame frame)
        {
            int size = Width * Height;

            RawPixelData = new Pixel[size];

            switch (frame.File.Header.ColorDepth)
            {
            case ColorDepth.RGBA:
                for (int i = 0; i < size; i++)
                {
                    byte[] color = reader.ReadBytes(4);

                    RawPixelData[i] = new RGBAPixel(frame, color);
                }
                break;

            case ColorDepth.Grayscale:
                for (int i = 0; i < size; i++)
                {
                    byte[] color = reader.ReadBytes(2);

                    RawPixelData[i] = new GrayscalePixel(frame, color);
                }
                break;

            case ColorDepth.Indexed:
                for (int i = 0; i < size; i++)
                {
                    byte color = reader.ReadByte();

                    RawPixelData[i] = new IndexedPixel(frame, color);
                }
                break;
            }
        }
示例#12
0
 public CLR0MaterialEntry(RGBAPixel mask, RGBAPixel color)
 {
     _colorMask  = mask;
     _data._data = *(int *)&color;
 }
示例#13
0
        protected internal override void OnRebuild(VoidPtr address, int length, bool force)
        {
            base.OnRebuild(address, length, force);

            SCN0Fog *header = (SCN0Fog *)address;

            if (colors.Count > 1)
            {
                *((bint *)header->_color.Address) = (int)lightAddr - (int)header->_color.Address;
                for (int i = 0; i <= ((SCN0Node)Parent.Parent).FrameCount; i++)
                {
                    if (i < colors.Count)
                    {
                        *lightAddr++ = colors[i];
                    }
                    else
                    {
                        *lightAddr++ = new RGBAPixel();
                    }
                }
                flags &= ~SCN0FogFlags.FixedColor;
            }
            else
            {
                flags |= SCN0FogFlags.FixedColor;
                if (colors.Count == 1)
                {
                    header->_color = colors[0];
                }
                else
                {
                    header->_color = new RGBAPixel();
                }
            }
            if (starts.Count > 1)
            {
                *((bint *)header->_start.Address) = (int)keyframeAddr - (int)header->_start.Address;
                ((SCN0KeyframesHeader *)keyframeAddr)->_numFrames = (ushort)starts.Count;
                SCN0KeyframeStruct *addr = ((SCN0KeyframesHeader *)keyframeAddr)->Data;
                for (int i = 0; i < starts.Count; i++)
                {
                    *addr++ = starts[i];
                }
                keyframeAddr += 4 + starts.Count * 12;
                flags        &= ~SCN0FogFlags.FixedStart;
            }
            else
            {
                flags |= SCN0FogFlags.FixedStart;
                if (starts.Count == 1)
                {
                    header->_start = starts[0]._value;
                }
                else
                {
                    header->_start = 0;
                }
            }
            if (ends.Count > 1)
            {
                *((bint *)header->_end.Address) = (int)keyframeAddr - (int)header->_end.Address;
                ((SCN0KeyframesHeader *)keyframeAddr)->_numFrames = (ushort)ends.Count;
                SCN0KeyframeStruct *addr = ((SCN0KeyframesHeader *)keyframeAddr)->Data;
                for (int i = 0; i < ends.Count; i++)
                {
                    *addr++ = ends[i];
                }
                keyframeAddr += 4 + ends.Count * 12;
                flags        &= ~SCN0FogFlags.FixedEnd;
            }
            else
            {
                flags |= SCN0FogFlags.FixedEnd;
                if (ends.Count == 1)
                {
                    header->_end = ends[0]._value;
                }
                else
                {
                    header->_end = 0;
                }
            }

            header->_flags   = (byte)flags;
            header->_density = density;
        }
示例#14
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            //Build common header
            base.OnRebuild(address, length, force);

            //Reset addresses
            _lightAddress    = null;
            _specularAddress = null;

            //Don't write anything if this node is null
            if (_name == "<null>")
            {
                return;
            }

            //Write header information
            SCN0Light *header = (SCN0Light *)address;

            header->_nonSpecLightId = NonSpecularLightID;
            header->_userDataOffset = 0;
            header->_distFunc       = _distFunc;
            header->_spotFunc       = _spotFunc;

            int newFlags = 0;

            //Encode keyframe data
            for (int i = 0, index = 0; i < 14; i++)
            {
                if (!(i == 3 || i == 7 || i == 10 || i == 12))
                {
                    _dataAddrs[0] += EncodeKeyframes(
                        Keyframes[index],
                        _dataAddrs[0],
                        header->_startPoint._x.Address + i * 4,
                        ref newFlags,
                        (int)_ordered[index++]);
                }
            }

            _dataAddrs[1] += WriteColors(
                ref newFlags,
                (int)FixedFlags.ColorConstant,
                _solidColors[0],
                _lightColor,
                _constants[0],
                FrameCount,
                header->_lightColor.Address,
                ref _lightAddress,
                _matches[0] == null ? null : _matches[0]._lightAddress,
                (RGBAPixel *)_dataAddrs[1]);

            //Only bother writing if specular is enabled
            if (SpecularEnabled)
            {
                _dataAddrs[1] += WriteColors(
                    ref newFlags,
                    (int)FixedFlags.SpecColorConstant,
                    _solidColors[1],
                    _specColor,
                    _constants[1],
                    FrameCount,
                    header->_specularColor.Address,
                    ref _specularAddress,
                    _matches[1] == null ? null : _matches[1]._specularAddress,
                    (RGBAPixel *)_dataAddrs[1]);
            }
            else
            {
                //The value is set to 0
                header->_specularColor = new RGBAPixel();

                //The flag, while unused, seems to be set to the same state as the color constant flag
                if (_constants[0])
                {
                    newFlags |= (int)FixedFlags.SpecColorConstant;
                }
                else
                {
                    newFlags &= (int)~FixedFlags.SpecColorConstant;
                }
            }

            if (!ConstantVisibility && _entryCount != 0)
            {
                header->_visOffset = (int)_dataAddrs[2] - (int)header->_visOffset.Address;
                Marshal.Copy(_data, 0, (IntPtr)_dataAddrs[2], _data.Length);
                _dataAddrs[2] = ((VoidPtr)_dataAddrs[2] + EntryCount.Align(32) / 8);
            }
            else
            {
                newFlags |= (int)FixedFlags.EnabledConstant;
            }

            //Set newly calculated flags
            header->_fixedFlags = (ushort)(_fixedFlags = (FixedFlags)newFlags);
            header->_usageFlags = _typeUsageFlags._data;
        }
示例#15
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            base.OnRebuild(address, length, force);

            lightAddress    = null;
            specularAddress = null;

            SCN0Light *header = (SCN0Light *)address;

            if (_name != "<null>")
            {
                header->_nonSpecLightId = NonSpecularLightID;
                header->_part2Offset    = _part2Offset;
                header->_visOffset      = _enableOffset;
                header->_distFunc       = _distFunc;
                header->_spotFunc       = _spotFunc;

                int newFlags = 0;

                if (_lightColor.Count > 1)
                {
                    lightAddress = lightAddr;
                    if (match2 == null)
                    {
                        *((bint *)header->_lightColor.Address) = (int)lightAddr - (int)header->_lightColor.Address;
                        for (int x = 0; x <= FrameCount; x++)
                        {
                            if (x < _lightColor.Count)
                            {
                                *lightAddr++ = _lightColor[x];
                            }
                            else
                            {
                                *lightAddr++ = new RGBAPixel();
                            }
                        }
                    }
                    else
                    {
                        *((bint *)header->_lightColor.Address) = (int)match1.lightAddress - (int)header->_lightColor.Address;
                    }
                }
                else
                {
                    newFlags           |= (int)FixedFlags.ColorConstant;
                    header->_lightColor = _solidColors[0];
                }
                if (_specColor.Count > 1)
                {
                    specularAddress = lightAddr;
                    if (match2 == null)
                    {
                        *((bint *)header->_specularColor.Address) = (int)lightAddr - (int)header->_specularColor.Address;
                        for (int x = 0; x <= FrameCount; x++)
                        {
                            if (x < _specColor.Count)
                            {
                                *lightAddr++ = _specColor[x];
                            }
                            else
                            {
                                *lightAddr++ = new RGBAPixel();
                            }
                        }
                    }
                    else
                    {
                        *((bint *)header->_specularColor.Address) = (int)match2.specularAddress - (int)header->_specularColor.Address;
                    }
                }
                else
                {
                    newFlags |= (int)FixedFlags.SpecColorConstant;
                    header->_specularColor = _solidColors[1];
                }
                if (!SetConstant && _entryCount != 0)
                {
                    header->_visOffset = (int)visAddr - (int)header->_visOffset.Address;
                    Marshal.Copy(_data, 0, (IntPtr)visAddr, _data.Length);
                    visAddr = ((VoidPtr)visAddr + EntryCount.Align(32) / 8);
                }
                else
                {
                    newFlags |= (int)FixedFlags.EnabledConstant;
                }

                bint *values = (bint *)&header->_startPoint;
                int   index  = 0;
                for (int i = 0; i < 14; i++)
                {
                    if (!(i == 3 || i == 7 || i == 10 || i == 12))
                    {
                        EncodeFrames(GetKeys(index), ref keyframeAddr, &values[i], ref newFlags, (int)_ordered[index++]);
                    }
                }

                header->_fixedFlags = _flags1 = (ushort)newFlags;
                header->_usageFlags = _flags2;
            }
        }
示例#16
0
 public void SetRGBA(int index, RGBAPixel value)
 {
     ((RGBAPixel *)_values.Address)[index] = value;
 }
示例#17
0
        internal unsafe void Precalc(MDL0PolygonNode parent, IMatrixNode[] nodes)
        {
            //If already calculated, and no weights, skip?
            bool hasNodes = parent.Model._linker.NodeCache.Length > 0;

            if ((_precVertices != null) && hasNodes)
            {
                return;
            }

            Vector3[] verts, norms = null;
            Vector3 * vPtr = null, nPtr = null;

            RGBAPixel[][] colors   = new RGBAPixel[2][];
            Vector2[][]   uvs      = new Vector2[8][];
            uint *        ptrCache = stackalloc uint[10];

            //Points
            verts = parent._vertexNode.Vertices;
            if (_precVertices == null)
            {
                _precVertices = new UnsafeBuffer(_elementCount * 12);
            }
            vPtr = (Vector3 *)_precVertices.Address;

            //Normals
            if (parent._normalNode != null)
            {
                norms = parent._normalNode.Normals;
                if (_precNormals == null)
                {
                    _precNormals = new UnsafeBuffer(_elementCount * 12);
                }
                nPtr = (Vector3 *)_precNormals.Address;
            }
            else if (_precNormals != null)
            {
                _precNormals.Dispose();
                _precNormals = null;
            }

            ////Colors
            //for (int i = 0; i < 1; i++)
            //{
            //    if (parent._colorSet[i] != null)
            //    {
            //        colors[i] = parent._colorSet[i].Colors;
            //        if (_precColors == null)
            //            _precColors = new UnsafeBuffer(_elementCount * 4);
            //        ptrCache[i] = (uint)_precColors.Address;
            //    }
            //    else if (_precColors != null)
            //    {
            //        _precColors.Dispose();
            //        _precColors = null;
            //    }
            //}

            //UVs
            for (int i = 0; i < 8; i++)
            {
                if (parent._uvSet[i] != null)
                {
                    uvs[i] = parent._uvSet[i].Points;
                    if (_precUVs[i] == null)
                    {
                        _precUVs[i] = new UnsafeBuffer(_elementCount * 8);
                    }
                    ptrCache[i + 2] = (uint)_precUVs[i].Address;
                }
                else if (_precUVs[i] != null)
                {
                    _precUVs[i].Dispose();
                    _precUVs[i] = null;
                }
            }

            int count = _vertices.Count;

            for (int x = 0; x < count; x++)
            {
                Vertex3 vert = _vertices[x];

                ////Vertices
                //if (hasNodes)
                //    *vPtr++ = nodes[vert.Influence.NodeIndex].Matrix.Multiply(verts[vert.Position]);
                //else
                //    *vPtr++ = verts[vert.Position];

                ////Normals
                //if (nPtr != null)
                //{
                //    if (hasNodes)
                //        *nPtr++ = nodes[vert.Influence.NodeIndex].Matrix.Multiply(norms[vert.Normal]);
                //    else
                //        *nPtr++ = norms[vert.Normal.Length];
                //}

                ////Colors
                //for (int i = 0; i < 1; i++)
                //{
                //    RGBAPixel* cPtr = (RGBAPixel*)ptrCache[i];
                //    if (cPtr != null)
                //        cPtr[x] = colors[i][vert.Color[i]];
                //}

                ////UVs
                //for (int i = 0; i < 8; i++)
                //{
                //    Vector2* uPtr = (Vector2*)ptrCache[i + 2];
                //    if (uPtr != null)
                //        uPtr[x] = uvs[i][vert.UV[i]];
                //}
            }
        }
示例#18
0
 public CLR0Material(CLR0EntryFlags flags, RGBAPixel mask, RGBAPixel color)
 {
     _stringOffset = 0;
     _flags        = (uint)flags;
 }
示例#19
0
        private void FinishMDL0(MDL0Node model)
        {
            Error = "There was a problem creating a default material and shader.";
            if (model._matList.Count == 0 && model._objList.Count != 0)
            {
                MDL0MaterialNode mat = new MDL0MaterialNode()
                {
                    _name = "Default",
                };
                (mat.ShaderNode = new MDL0ShaderNode()).AddChild(new MDL0TEVStageNode()
                {
                    RasterColor     = ColorSelChan.LightChannel0,
                    AlphaSelectionD = AlphaArg.RasterAlpha,
                    ColorSelectionD = ColorArg.RasterColor,
                });

                model._shadGroup.AddChild(mat.ShaderNode);
                model._matGroup.AddChild(mat);

                foreach (MDL0ObjectNode obj in model._objList)
                {
                    if (obj._drawCalls.Count == 0)
                    {
                        obj._drawCalls.Add(new DrawCall(obj));
                    }

                    obj._drawCalls[0].MaterialNode = mat;
                }
            }

            Error = "There was a problem removing original color buffers.";

            //Remove original color buffers if option set
            if (_importOptions._ignoreColors)
            {
                if (model._objList != null && model._objList.Count != 0)
                {
                    foreach (MDL0ObjectNode p in model._objList)
                    {
                        for (int x = 2; x < 4; x++)
                        {
                            if (p._manager._faceData[x] != null)
                            {
                                p._manager._faceData[x].Dispose();
                                p._manager._faceData[x] = null;
                            }
                        }
                    }
                }
            }

            Error = "There was a problem adding default color values.";

            //Add color buffers if option set
            if (_importOptions._addClrs)
            {
                RGBAPixel pixel = _importOptions._dfltClr;

                //Add a color buffer to objects that don't have one
                if (model._objList != null && model._objList.Count != 0)
                {
                    foreach (MDL0ObjectNode p in model._objList)
                    {
                        if (p._manager._faceData[2] == null)
                        {
                            RGBAPixel *pIn = (RGBAPixel *)(p._manager._faceData[2] = new UnsafeBuffer(4 * p._manager._pointCount)).Address;
                            for (int i = 0; i < p._manager._pointCount; i++)
                            {
                                *pIn++ = pixel;
                            }
                        }
                    }
                }
            }

            Error = "There was a problem initializing materials.";

            //Apply defaults to materials
            if (model._matList != null)
            {
                foreach (MDL0MaterialNode mat in model._matList)
                {
                    mat._activeStages = mat.ShaderNode.Stages;
                    if (_importOptions._mdlType == ImportOptions.MDLType.Stage)
                    {
                        mat._lightSetIndex = 0;
                        mat._fogIndex      = 0;
                    }
                }
            }

            Error = "There was a problem remapping materials.";

            //Remap materials if option set
            if (_importOptions._rmpMats && model._matList != null && model._objList != null)
            {
                foreach (MDL0ObjectNode obj3 in model._objList)
                {
                    MDL0MaterialNode mat = obj3._drawCalls[0].MaterialNode;
                    foreach (MDL0MaterialNode m in model._matList)
                    {
                        if (m.Children.Count > 0 &&
                            m.Children[0] != null &&
                            mat != null &&
                            mat.Children.Count > 0 &&
                            mat.Children[0] != null &&
                            m.Children[0].Name == mat.Children[0].Name &&
                            m.C1ColorMaterialSource == mat.C1ColorMaterialSource)
                        {
                            obj3._drawCalls[0].MaterialNode = m;
                            break;
                        }
                    }
                }

                //Remove unused materials
                for (int i = 0; i < model._matList.Count; i++)
                {
                    if (((MDL0MaterialNode)model._matList[i])._objects.Count == 0)
                    {
                        model._matList.RemoveAt(i--);
                    }
                }
            }

            Error = "There was a problem writing the model.";

            //Clean the model and then build it!
            if (model != null)
            {
                model.FinishImport();
            }
        }
示例#20
0
 public CLR0MaterialEntry(RGBAPixel mask, int offset)
 {
     _colorMask = mask;
     _data      = offset;
 }
示例#21
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            base.OnRebuild(address, length, force);

            _matchAddr = null;

            SCN0Fog *header = (SCN0Fog *)address;

            flags = SCN0FogFlags.None;
            if (_colors.Count > 1)
            {
                _matchAddr = lightAddr;
                if (_match == null)
                {
                    *((bint *)header->_color.Address) = (int)lightAddr - (int)header->_color.Address;
                    for (int i = 0; i <= ((SCN0Node)Parent.Parent).FrameCount; i++)
                    {
                        if (i < _colors.Count)
                        {
                            *lightAddr++ = (RGBAPixel)_colors[i];
                        }
                        else
                        {
                            *lightAddr++ = new RGBAPixel();
                        }
                    }
                }
                else
                {
                    *((bint *)header->_color.Address) = (int)_match._matchAddr - (int)header->_color.Address;
                }
            }
            else
            {
                flags         |= SCN0FogFlags.FixedColor;
                header->_color = (RGBAPixel)_solidColor;
            }
            if (_startKeys._keyCount > 1)
            {
                *((bint *)header->_start.Address) = (int)keyframeAddr - (int)header->_start.Address;
                EncodeFrames(_startKeys, ref keyframeAddr);
            }
            else
            {
                flags |= SCN0FogFlags.FixedStart;
                if (_startKeys._keyCount == 1)
                {
                    header->_start = _startKeys._keyRoot._next._value;
                }
                else
                {
                    header->_start = 0;
                }
            }
            if (_endKeys._keyCount > 1)
            {
                *((bint *)header->_end.Address) = (int)keyframeAddr - (int)header->_end.Address;
                EncodeFrames(_endKeys, ref keyframeAddr);
            }
            else
            {
                flags |= SCN0FogFlags.FixedEnd;
                if (_endKeys._keyCount == 1)
                {
                    header->_end = _endKeys._keyRoot._next._value;
                }
                else
                {
                    header->_end = 0;
                }
            }

            header->_flags = (byte)flags;
            header->_type  = type;
        }
示例#22
0
        protected internal override void OnRebuild(VoidPtr address, int length, bool force)
        {
            SCN0Light *header = (SCN0Light *)address;

            base.OnRebuild(address, length, force);

            if (_name != "<null>")
            {
                header->_unk1  = _unk1;
                header->_unk2  = _unk2;
                header->_unk5  = _unk5;
                header->_unk6  = _unk6;
                header->_unk7  = _unk7;
                header->_unk8  = _unk8;
                header->_unk9  = _unk9;
                header->_unk10 = _unk10;
                header->_unk12 = _unk12;

                if (_lighting1.Count > 1)
                {
                    *((bint *)header->_lighting1.Address) = (int)lightAddr - (int)header->_lighting1.Address;
                    for (int i = 0; i <= ((SCN0Node)Parent.Parent).FrameCount; i++)
                    {
                        if (i < _lighting1.Count)
                        {
                            *lightAddr++ = _lighting1[i];
                        }
                        else
                        {
                            *lightAddr++ = new RGBAPixel();
                        }
                    }
                    _flags1[6] = false;
                }
                else
                {
                    _flags1[6] = true;
                    if (_lighting1.Count == 1)
                    {
                        header->_lighting1 = _lighting1[0];
                    }
                    else
                    {
                        header->_lighting1 = new RGBAPixel();
                    }
                }

                if (_lighting2.Count > 1)
                {
                    *((bint *)header->_lighting2.Address) = (int)lightAddr - (int)header->_lighting2.Address;
                    for (int i = 0; i <= ((SCN0Node)Parent.Parent).FrameCount; i++)
                    {
                        if (i < _lighting2.Count)
                        {
                            *lightAddr++ = _lighting2[i];
                        }
                        else
                        {
                            *lightAddr++ = new RGBAPixel();
                        }
                    }
                    _flags1[14] = false;
                }
                else
                {
                    _flags1[14] = true;
                    if (_lighting2.Count == 1)
                    {
                        header->_lighting2 = _lighting2[0];
                    }
                    else
                    {
                        header->_lighting2 = new RGBAPixel();
                    }
                }
                if (xEnds.Count > 1)
                {
                    *((bint *)header->_vec1._x.Address) = (int)keyframeAddr - (int)header->_vec1._x.Address;
                    ((SCN0KeyframesHeader *)keyframeAddr)->_numFrames = (ushort)xEnds.Count;
                    SCN0KeyframeStruct *addr = ((SCN0KeyframesHeader *)keyframeAddr)->Data;
                    for (int i = 0; i < xEnds.Count; i++)
                    {
                        *addr++ = xEnds[i];
                    }
                    keyframeAddr += 4 + xEnds.Count * 12;
                    _flags1[3]    = false;
                }
                else
                {
                    _flags1[3] = true;
                    if (xEnds.Count == 1)
                    {
                        header->_vec1._x = xEnds[0]._value;
                    }
                    else
                    {
                        header->_vec1._x = 0;
                    }
                }
                if (yEnds.Count > 1)
                {
                    *((bint *)header->_vec1._y.Address) = (int)keyframeAddr - (int)header->_vec1._y.Address;
                    ((SCN0KeyframesHeader *)keyframeAddr)->_numFrames = (ushort)yEnds.Count;
                    SCN0KeyframeStruct *addr = ((SCN0KeyframesHeader *)keyframeAddr)->Data;
                    for (int i = 0; i < yEnds.Count; i++)
                    {
                        *addr++ = yEnds[i];
                    }
                    keyframeAddr += 4 + yEnds.Count * 12;
                    _flags1[4]    = false;
                }
                else
                {
                    _flags1[4] = true;
                    if (yEnds.Count == 1)
                    {
                        header->_vec1._y = yEnds[0]._value;
                    }
                    else
                    {
                        header->_vec1._y = 0;
                    }
                }
                if (zEnds.Count > 1)
                {
                    *((bint *)header->_vec1._z.Address) = (int)keyframeAddr - (int)header->_vec1._z.Address;
                    ((SCN0KeyframesHeader *)keyframeAddr)->_numFrames = (ushort)zEnds.Count;
                    SCN0KeyframeStruct *addr = ((SCN0KeyframesHeader *)keyframeAddr)->Data;
                    for (int i = 0; i < zEnds.Count; i++)
                    {
                        *addr++ = zEnds[i];
                    }
                    keyframeAddr += 4 + zEnds.Count * 12;
                    _flags1[5]    = false;
                }
                else
                {
                    _flags1[5] = true;
                    if (zEnds.Count == 1)
                    {
                        header->_vec1._z = zEnds[0]._value;
                    }
                    else
                    {
                        header->_vec1._z = 0;
                    }
                }
                if (xStarts.Count > 1)
                {
                    *((bint *)header->_vec2._x.Address) = (int)keyframeAddr - (int)header->_vec2._x.Address;
                    ((SCN0KeyframesHeader *)keyframeAddr)->_numFrames = (ushort)xStarts.Count;
                    SCN0KeyframeStruct *addr = ((SCN0KeyframesHeader *)keyframeAddr)->Data;
                    for (int i = 0; i < xStarts.Count; i++)
                    {
                        *addr++ = xStarts[i];
                    }
                    keyframeAddr += 4 + xStarts.Count * 12;
                    _flags1[7]    = false;
                }
                else
                {
                    _flags1[7] = true;
                    if (xStarts.Count == 1)
                    {
                        header->_vec2._x = xStarts[0]._value;
                    }
                    else
                    {
                        header->_vec2._x = 0;
                    }
                }
                if (yStarts.Count > 1)
                {
                    *((bint *)header->_vec2._y.Address) = (int)keyframeAddr - (int)header->_vec2._y.Address;
                    ((SCN0KeyframesHeader *)keyframeAddr)->_numFrames = (ushort)yStarts.Count;
                    SCN0KeyframeStruct *addr = ((SCN0KeyframesHeader *)keyframeAddr)->Data;
                    for (int i = 0; i < yStarts.Count; i++)
                    {
                        *addr++ = yStarts[i];
                    }
                    keyframeAddr += 4 + yStarts.Count * 12;
                    _flags1[8]    = false;
                }
                else
                {
                    _flags1[8] = true;
                    if (yStarts.Count == 1)
                    {
                        header->_vec2._y = yStarts[0]._value;
                    }
                    else
                    {
                        header->_vec2._y = 0;
                    }
                }
                if (zStarts.Count > 1)
                {
                    *((bint *)header->_vec2._z.Address) = (int)keyframeAddr - (int)header->_vec2._z.Address;
                    ((SCN0KeyframesHeader *)keyframeAddr)->_numFrames = (ushort)zStarts.Count;
                    SCN0KeyframeStruct *addr = ((SCN0KeyframesHeader *)keyframeAddr)->Data;
                    for (int i = 0; i < zStarts.Count; i++)
                    {
                        *addr++ = zStarts[i];
                    }
                    keyframeAddr += 4 + zStarts.Count * 12;
                    _flags1[9]    = false;
                }
                else
                {
                    _flags1[9] = true;
                    if (zStarts.Count == 1)
                    {
                        header->_vec2._z = zStarts[0]._value;
                    }
                    else
                    {
                        header->_vec2._z = 0;
                    }
                }

                header->_flags1 = _flags1.data;
                header->_flags2 = _flags2.data;
            }
        }