示例#1
0
        public static UnsafeBuffer Decode(MDL0ColorData *header)
        {
            int          count  = header->_numEntries;
            UnsafeBuffer buffer = new UnsafeBuffer(count * 4);
            byte *       pIn    = (byte *)header + header->_dataOffset;
            byte *       pOut   = (byte *)buffer.Address;

            ColorCodecConverter dec;

            switch (header->Type)
            {
            case WiiColorComponentType.RGB565: dec = Color_wRGB565_RGBA; break;

            case WiiColorComponentType.RGB8: dec = Color_RGB_RGBA; break;

            case WiiColorComponentType.RGBA4: dec = Color_wRGBA4_RGBA; break;

            case WiiColorComponentType.RGBA6: dec = Color_wRGBA6_RGBA; break;

            case WiiColorComponentType.RGBA8: dec = Color_RGBA_RGBA; break;

            case WiiColorComponentType.RGBX8: dec = Color_RGBX_RGBA; break;

            default: return(null);
            }

            while (count-- > 0)
            {
                dec(ref pIn, ref pOut);
            }

            return(buffer);
        }
示例#2
0
        public override void OnRebuild(VoidPtr address, int length, bool force)
        {
            if (Model._isImport || _changed)
            {
                //Write header
                MDL0ColorData *header = (MDL0ColorData *)address;
                header->_dataLen     = length;
                header->_dataOffset  = 0x20;
                header->_index       = _entryIndex;
                header->_isRGBA      = _enc._hasAlpha ? 1 : 0;
                header->_format      = (int)_enc._outType;
                header->_entryStride = (byte)_enc._dstStride;
                header->_pad         = 0;
                header->_numEntries  = (ushort)Colors.Length;

                //Write data
                _enc.Write((byte *)header + 0x20);
                _enc.Dispose();
                _enc = null;
            }
            else
            {
                base.OnRebuild(address, length, force);
            }
        }
示例#3
0
        protected internal override void PostProcess(VoidPtr mdlAddress, VoidPtr dataAddress, StringTable stringTable)
        {
            MDL0ColorData *header = (MDL0ColorData *)dataAddress;

            header->_mdl0Offset   = (int)mdlAddress - (int)dataAddress;
            header->_stringOffset = (int)stringTable[Name] + 4 - (int)dataAddress;
        }
示例#4
0
        protected internal override void OnRebuild(VoidPtr address, int length, bool force)
        {
            MDL0ColorData *header = (MDL0ColorData *)address;

            header->_dataLen     = length;
            header->_dataOffset  = 0x20;
            header->_index       = _entryIndex;
            header->_isRGBA      = _enc._hasAlpha ? 1 : 0;
            header->_format      = (int)_enc._outType;
            header->_entryStride = (byte)_enc._outStride;
            header->_scale       = 0;
            header->_numEntries  = (ushort)Colors.Length;

            _enc.Write(Colors, (byte *)header + 0x20);
            _enc = null;
        }
示例#5
0
        public static ARGBPixel[] ExtractColors(MDL0ColorData *colors)
        {
            int count = colors->_numEntries;

            ARGBPixel[] c = new ARGBPixel[count];

            fixed(ARGBPixel *p = c)
            {
                ARGBPixel *dPtr = p;

                switch (colors->Type)
                {
                case WiiColorComponentType.RGB565:
                {
                    wRGB565Pixel *sPtr = (wRGB565Pixel *)colors->Data;
                    for (int i = 0; i < count; i++)
                    {
                        *dPtr++ = (ARGBPixel)(*sPtr++);
                    }
                    break;
                }

                case WiiColorComponentType.RGB8:
                {
                    wRGBPixel *sPtr = (wRGBPixel *)colors->Data;
                    for (int i = 0; i < count; i++)
                    {
                        *dPtr++ = (ARGBPixel)(*sPtr++);
                    }
                    break;
                }

                case WiiColorComponentType.RGBX8:
                {
                    wRGBXPixel *sPtr = (wRGBXPixel *)colors->Data;
                    for (int i = 0; i < count; i++)
                    {
                        *dPtr++ = (ARGBPixel)(*sPtr++);
                    }
                    break;
                }

                case WiiColorComponentType.RGBA4:
                {
                    wRGBA4Pixel *sPtr = (wRGBA4Pixel *)colors->Data;
                    for (int i = 0; i < count; i++)
                    {
                        *dPtr++ = (ARGBPixel)(*sPtr++);
                    }
                    break;
                }

                case WiiColorComponentType.RGBA6:
                {
                    wRGBA6Pixel *sPtr = (wRGBA6Pixel *)colors->Data;
                    for (int i = 0; i < count; i++)
                    {
                        *dPtr++ = (ARGBPixel)(*sPtr++);
                    }
                    break;
                }

                case WiiColorComponentType.RGBA8:
                {
                    wRGBAPixel *sPtr = (wRGBAPixel *)colors->Data;
                    for (int i = 0; i < count; i++)
                    {
                        *dPtr++ = (ARGBPixel)(*sPtr++);
                    }
                    break;
                }
                }
            }

            return(c);
        }
示例#6
0
        //Write assets will only be used for model imports.
        private static void WriteAssets(Collada form, ModelLinker linker, ref byte *pData)
        {
            int      index;
            MDL0Node model = linker.Model;

            if (linker._vertices != null && linker._vertices.Count != 0)
            {
                model.LinkGroup(new MDL0GroupNode(MDLResourceType.Vertices));
                model._vertGroup._parent = model;

                index = 0;
                foreach (VertexCodec c in linker._vertices)
                {
                    MDL0VertexNode node = new MDL0VertexNode();

                    node._name = model.Name + "_" + model._objList[index]._name;
                    if (((MDL0ObjectNode)model._objList[index])._drawCalls[0].MaterialNode != null)
                    {
                        node._name += "_" + ((MDL0ObjectNode)model._objList[index])._drawCalls[0].MaterialNode._name;
                    }

                    if (form != null)
                    {
                        form.Say("Writing Vertices - " + node.Name);
                    }

                    MDL0VertexData *header = (MDL0VertexData *)pData;
                    header->_dataLen     = c._dataLen.Align(0x20) + 0x40;
                    header->_dataOffset  = 0x40;
                    header->_index       = index++;
                    header->_isXYZ       = c._hasZ ? 1 : 0;
                    header->_type        = (int)c._type;
                    header->_divisor     = (byte)c._scale;
                    header->_entryStride = (byte)c._dstStride;
                    header->_numVertices = (ushort)c._dstCount;
                    header->_eMin        = c._min;
                    header->_eMax        = c._max;
                    header->_pad1        = header->_pad2 = 0;

                    c.Write(pData + 0x40);

                    node._replSrc = node._replUncompSrc = new DataSource(header, header->_dataLen);
                    model._vertGroup.AddChild(node, false);

                    pData += header->_dataLen;
                }
            }

            if (linker._normals != null && linker._normals.Count != 0)
            {
                model.LinkGroup(new MDL0GroupNode(MDLResourceType.Normals));
                model._normGroup._parent = model;

                index = 0;
                foreach (VertexCodec c in linker._normals)
                {
                    MDL0NormalNode node = new MDL0NormalNode();

                    node._name = model.Name + "_" + model._objList[index]._name;
                    if (((MDL0ObjectNode)model._objList[index])._drawCalls[0].MaterialNode != null)
                    {
                        node._name += "_" + ((MDL0ObjectNode)model._objList[index])._drawCalls[0].MaterialNode._name;
                    }

                    if (form != null)
                    {
                        form.Say("Writing Normals - " + node.Name);
                    }

                    MDL0NormalData *header = (MDL0NormalData *)pData;
                    header->_dataLen     = c._dataLen.Align(0x20) + 0x20;
                    header->_dataOffset  = 0x20;
                    header->_index       = index++;
                    header->_isNBT       = 0;
                    header->_type        = (int)c._type;
                    header->_divisor     = (byte)c._scale;
                    header->_entryStride = (byte)c._dstStride;
                    header->_numVertices = (ushort)c._dstCount;

                    c.Write(pData + 0x20);

                    node._replSrc = node._replUncompSrc = new DataSource(header, header->_dataLen);
                    model._normGroup.AddChild(node, false);

                    pData += header->_dataLen;
                }
            }

            if (linker._colors != null && linker._colors.Count != 0)
            {
                model.LinkGroup(new MDL0GroupNode(MDLResourceType.Colors));
                model._colorGroup._parent = model;

                index = 0;
                foreach (ColorCodec c in linker._colors)
                {
                    MDL0ColorNode node = new MDL0ColorNode();

                    node._name = model.Name + "_" + model._objList[index]._name;
                    if (((MDL0ObjectNode)model._objList[index])._drawCalls[0].MaterialNode != null)
                    {
                        node._name += "_" + ((MDL0ObjectNode)model._objList[index])._drawCalls[0].MaterialNode._name;
                    }

                    if (form != null)
                    {
                        form.Say("Writing Colors - " + node.Name);
                    }

                    MDL0ColorData *header = (MDL0ColorData *)pData;
                    header->_dataLen     = c._dataLen.Align(0x20) + 0x20;
                    header->_dataOffset  = 0x20;
                    header->_index       = index++;
                    header->_isRGBA      = c._hasAlpha ? 1 : 0;
                    header->_format      = (int)c._outType;
                    header->_entryStride = (byte)c._dstStride;
                    header->_pad         = 0;
                    header->_numEntries  = (ushort)c._dstCount;

                    c.Write(pData + 0x20);

                    node._replSrc = node._replUncompSrc = new DataSource(header, header->_dataLen);
                    model._colorGroup.AddChild(node, false);

                    pData += header->_dataLen;
                }
            }

            if (linker._uvs != null && linker._uvs.Count != 0)
            {
                model.LinkGroup(new MDL0GroupNode(MDLResourceType.UVs));
                model._uvGroup._parent = model;

                index = 0;
                foreach (VertexCodec c in linker._uvs)
                {
                    MDL0UVNode node = new MDL0UVNode()
                    {
                        _name = "#" + index
                    };

                    if (form != null)
                    {
                        form.Say("Writing UVs - " + node.Name);
                    }

                    MDL0UVData *header = (MDL0UVData *)pData;
                    header->_dataLen     = c._dataLen.Align(0x20) + 0x40;
                    header->_dataOffset  = 0x40;
                    header->_index       = index++;
                    header->_format      = (int)c._type;
                    header->_divisor     = (byte)c._scale;
                    header->_isST        = 1;
                    header->_entryStride = (byte)c._dstStride;
                    header->_numEntries  = (ushort)c._dstCount;
                    header->_min         = (Vector2)c._min;
                    header->_max         = (Vector2)c._max;
                    header->_pad1        = header->_pad2 = header->_pad3 = header->_pad4 = 0;

                    c.Write(pData + 0x40);

                    node._replSrc = node._replUncompSrc = new DataSource(header, header->_dataLen);
                    model._uvGroup.AddChild(node, false);

                    pData += header->_dataLen;
                }
            }

            //Clean groups
            if (model._vertList != null && model._vertList.Count > 0)
            {
                model._children.Add(model._vertGroup);
                linker.Groups[(int)(MDLResourceType)Enum.Parse(typeof(MDLResourceType), model._vertGroup.Name)] = model._vertGroup;
            }
            else
            {
                model.UnlinkGroup(model._vertGroup);
            }

            if (model._normList != null && model._normList.Count > 0)
            {
                model._children.Add(model._normGroup);
                linker.Groups[(int)(MDLResourceType)Enum.Parse(typeof(MDLResourceType), model._normGroup.Name)] = model._normGroup;
            }
            else
            {
                model.UnlinkGroup(model._normGroup);
            }

            if (model._uvList != null && model._uvList.Count > 0)
            {
                model._children.Add(model._uvGroup);
                linker.Groups[(int)(MDLResourceType)Enum.Parse(typeof(MDLResourceType), model._uvGroup.Name)] = model._uvGroup;
            }
            else
            {
                model.UnlinkGroup(model._uvGroup);
            }

            if (model._colorList != null && model._colorList.Count > 0)
            {
                model._children.Add(model._colorGroup);
                linker.Groups[(int)(MDLResourceType)Enum.Parse(typeof(MDLResourceType), model._colorGroup.Name)] = model._colorGroup;
            }
            else
            {
                model.UnlinkGroup(model._colorGroup);
            }

            //Link sets
            if (model._objList != null)
            {
                foreach (MDL0ObjectNode poly in model._objList)
                {
                    if (poly._elementIndices[0] != -1 && model._vertList != null && model._vertList.Count > poly._elementIndices[0])
                    {
                        poly._vertexNode = (MDL0VertexNode)model._vertGroup._children[poly._elementIndices[0]];
                    }
                    if (poly._elementIndices[1] != -1 && model._normList != null && model._normList.Count > poly._elementIndices[1])
                    {
                        poly._normalNode = (MDL0NormalNode)model._normGroup._children[poly._elementIndices[1]];
                    }
                    for (int i = 2; i < 4; i++)
                    {
                        if (poly._elementIndices[i] != -1 && model._colorList != null && model._colorList.Count > poly._elementIndices[i])
                        {
                            poly._colorSet[i - 2] = (MDL0ColorNode)model._colorGroup._children[poly._elementIndices[i]];
                        }
                    }
                    for (int i = 4; i < 12; i++)
                    {
                        if (poly._elementIndices[i] != -1 && model._uvList != null && model._uvList.Count > poly._elementIndices[i])
                        {
                            poly._uvSet[i - 4] = (MDL0UVNode)model._uvGroup._children[poly._elementIndices[i]];
                        }
                    }
                }
            }
        }
示例#7
0
        private static void WriteAssets(ModelLinker linker, ref byte *pGroup, ref byte *pData)
        {
            ResourceGroup *group;
            ResourceEntry *entry;
            int            index;

            if (linker._vertices != null)
            {
                linker.Vertices = group = (ResourceGroup *)pGroup;
                *group = new ResourceGroup(linker._vertices.Count);
                entry = &group->_first + 1;

                index = 0;
                foreach (VertexCodec c in linker._vertices)
                {
                    (entry++)->_dataOffset = (int)(pData - pGroup);

                    MDL0VertexData *header = (MDL0VertexData *)pData;
                    header->_dataLen     = c._dataLen.Align(0x20) + 0x40;
                    header->_dataOffset  = 0x40;
                    header->_index       = index;
                    header->_isXYZ       = c._hasZ ? 1 : 0;
                    header->_type        = (int)c._type;
                    header->_divisor     = (byte)c._scale;
                    header->_entryStride = (byte)c._dstStride;
                    header->_numVertices = (short)c._dstCount;
                    header->_eMin        = c._min;
                    header->_eMax        = c._max;
                    header->_pad1        = header->_pad2 = 0;

                    c.Write(pData + 0x40);
                    pData += header->_dataLen;
                }

                pGroup += group->_totalSize;
            }

            if (linker._normals != null)
            {
                linker.Normals = group = (ResourceGroup *)pGroup;
                *group = new ResourceGroup(linker._normals.Count);
                entry = &group->_first + 1;

                index = 0;
                foreach (VertexCodec c in linker._normals)
                {
                    (entry++)->_dataOffset = (int)(pData - pGroup);

                    MDL0NormalData *header = (MDL0NormalData *)pData;
                    header->_dataLen     = c._dataLen.Align(0x20) + 0x20;
                    header->_dataOffset  = 0x20;
                    header->_index       = index;
                    header->_isNBT       = 0;
                    header->_type        = (int)c._type;
                    header->_divisor     = (byte)c._scale;
                    header->_entryStride = (byte)c._dstStride;
                    header->_numVertices = (ushort)c._dstCount;

                    c.Write(pData + 0x20);
                    pData += header->_dataLen;
                }

                pGroup += group->_totalSize;
            }

            if (linker._colors != null)
            {
                linker.Colors = group = (ResourceGroup *)pGroup;
                *group = new ResourceGroup(linker._colors.Count);
                entry = &group->_first + 1;

                index = 0;
                foreach (ColorCodec c in linker._colors)
                {
                    (entry++)->_dataOffset = (int)(pData - pGroup);

                    MDL0ColorData *header = (MDL0ColorData *)pData;
                    header->_dataLen     = c._dataLen.Align(0x20) + 0x20;
                    header->_dataOffset  = 0x20;
                    header->_index       = index;
                    header->_isRGBA      = c._hasAlpha ? 1 : 0;
                    header->_format      = (int)c._outType;
                    header->_entryStride = (byte)c._dstStride;
                    header->_scale       = 0;
                    header->_numEntries  = (ushort)c._dstCount;

                    c.Write(pData + 0x20);
                    pData += header->_dataLen;
                }
                pGroup += group->_totalSize;
            }

            if (linker._uvs != null)
            {
                linker.UVs = group = (ResourceGroup *)pGroup;
                *group = new ResourceGroup(linker._uvs.Count);
                entry = &group->_first + 1;

                index = 0;
                foreach (VertexCodec c in linker._uvs)
                {
                    (entry++)->_dataOffset = (int)(pData - pGroup);

                    MDL0UVData *header = (MDL0UVData *)pData;
                    header->_dataLen     = c._dataLen.Align(0x20) + 0x40;
                    header->_dataOffset  = 0x40;
                    header->_index       = index;
                    header->_format      = (int)c._type;
                    header->_divisor     = (byte)c._scale;
                    header->_isST        = 1;
                    header->_entryStride = (byte)c._dstStride;
                    header->_numEntries  = (ushort)c._dstCount;
                    header->_min         = (Vector2)c._min;
                    header->_max         = (Vector2)c._max;
                    header->_pad1        = header->_pad2 = header->_pad3 = header->_pad4 = 0;

                    c.Write(pData + 0x40);
                    pData += header->_dataLen;
                }

                pGroup += group->_totalSize;
            }
        }