Exemple #1
0
        private void BtnSave_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
        {
            if (modImageBytes != null)
            {
                TextureFormat fmt           = (TextureFormat)(ddTextureFmt.SelectedIndex + 1);
                byte[]        encImageBytes = TextureEncoderDecoder.Encode(modImageBytes, tex.m_Width, tex.m_Height, fmt);

                AssetTypeValueField m_StreamData = baseField.Get("m_StreamData");
                m_StreamData.Get("offset").GetValue().Set(0);
                m_StreamData.Get("size").GetValue().Set(0);
                m_StreamData.Get("path").GetValue().Set("");

                baseField.Get("m_TextureFormat").GetValue().Set((int)fmt);

                baseField.Get("m_Width").GetValue().Set(tex.m_Width);
                baseField.Get("m_Height").GetValue().Set(tex.m_Height);

                AssetTypeValueField image_data = baseField.Get("image data");
                image_data.GetValue().type     = EnumValueTypes.ByteArray;
                image_data.templateField.valueType = EnumValueTypes.ByteArray;
                AssetTypeByteArray byteArray = new AssetTypeByteArray()
                {
                    size = (uint)encImageBytes.Length,
                    data = encImageBytes
                };
                image_data.GetValue().Set(byteArray);
            }
            Close(true);
        }
Exemple #2
0
        private async Task <bool> ImportTextures(Window win, List <ImportBatchInfo> batchInfos)
        {
            StringBuilder errorBuilder = new StringBuilder();

            foreach (ImportBatchInfo batchInfo in batchInfos)
            {
                AssetContainer cont = batchInfo.cont;

                string errorAssetName   = $"{Path.GetFileName(cont.FileInstance.path)}/{cont.PathId}";
                string selectedFilePath = batchInfo.importFile;

                if (!cont.HasInstance)
                {
                    continue;
                }

                AssetTypeValueField baseField = cont.TypeInstance.GetBaseField();
                TextureFormat       fmt       = (TextureFormat)baseField.Get("m_TextureFormat").GetValue().AsInt();

                byte[] encImageBytes = TextureImportExport.ImportPng(selectedFilePath, fmt, out int width, out int height);

                if (encImageBytes == null)
                {
                    errorBuilder.AppendLine($"[{errorAssetName}]: Failed to encode texture format {fmt}");
                    continue;
                }

                AssetTypeValueField m_StreamData = baseField.Get("m_StreamData");
                m_StreamData.Get("offset").GetValue().Set(0);
                m_StreamData.Get("size").GetValue().Set(0);
                m_StreamData.Get("path").GetValue().Set("");

                baseField.Get("m_TextureFormat").GetValue().Set((int)fmt);

                baseField.Get("m_Width").GetValue().Set(width);
                baseField.Get("m_Height").GetValue().Set(height);

                AssetTypeValueField image_data = baseField.Get("image data");
                image_data.GetValue().type     = EnumValueTypes.ByteArray;
                image_data.templateField.valueType = EnumValueTypes.ByteArray;
                AssetTypeByteArray byteArray = new AssetTypeByteArray()
                {
                    size = (uint)encImageBytes.Length,
                    data = encImageBytes
                };
                image_data.GetValue().Set(byteArray);
            }

            if (errorBuilder.Length > 0)
            {
                string[] firstLines    = errorBuilder.ToString().Split('\n').Take(20).ToArray();
                string   firstLinesStr = string.Join('\n', firstLines);
                await MessageBoxUtil.ShowDialog(win, "Some errors occurred while exporting", firstLinesStr);
            }

            return(true);
        }
Exemple #3
0
        private void btnOK_Click(object sender, EventArgs e)
        {
            if (imgBytes == null)
            {
                DialogResult = DialogResult.Cancel;
            }

            var format       = (TextureFormat)(cboxTextureFormat.SelectedIndex + 1);
            var encodedBytes = TextureManager.EncodeTexture(imgBytes, tex.m_Width, tex.m_Height, format);

            var m_StreamData = texField.Get("m_StreamData");

            m_StreamData.Get("offset").GetValue().Set(0);
            m_StreamData.Get("size").GetValue().Set(0);
            m_StreamData.Get("path").GetValue().Set("");

            var image_data = texField.Get("image data");

            image_data.GetValue().type = EnumValueTypes.ByteArray;
            image_data.templateField.valueType = EnumValueTypes.ByteArray;
            var byteArray = new AssetTypeByteArray
            {
                size = (uint)encodedBytes.Length,
                data = encodedBytes
            };

            image_data.GetValue().Set(byteArray);

            texField.Get("m_ColorSpace").GetValue().Set(cboxColorSpace.SelectedIndex);
            texField.Get("m_LightmapFormat").GetValue().Set(tboxLightmapFormat.Text);

            var m_TextureSettings = texField.Get("m_TextureSettings");

            m_TextureSettings.Get("m_FilterMode").GetValue().Set(cboxFilterMode.SelectedIndex);
            m_TextureSettings.Get("m_Aniso").GetValue().Set(tboxAniso.Text);
            m_TextureSettings.Get("m_MipBias").GetValue().Set(tboxMipMapBias.Text);
            m_TextureSettings.Get("m_WrapU").GetValue().Set(cboxWrapU.SelectedIndex);
            m_TextureSettings.Get("m_WrapV").GetValue().Set(cboxWrapV.SelectedIndex);
            m_TextureSettings.Get("m_WrapW").GetValue().Set(1);

            texField.Get("m_TextureDimension").GetValue().Set(2);

            texField.Get("m_ImageCount").GetValue().Set(1);

            texField.Get("m_IsReadable").GetValue().Set(false);

            texField.Get("m_MipCount").GetValue().Set(1);

            texField.Get("m_TextureFormat").GetValue().Set((int)format);

            texField.Get("m_CompleteImageSize").GetValue().Set(encodedBytes.Length);

            texField.Get("m_Width").GetValue().Set(tex.m_Width);
            texField.Get("m_Height").GetValue().Set(tex.m_Height);

            texField.Get("m_Name").GetValue().Set(tboxTextureName.Text);
        }
        public static AssetTypeValue DefaultValueFromTemplate(AssetTypeTemplateField templateField)
        {
            object obj;

            switch (templateField.valueType)
            {
            case EnumValueTypes.Int8:
                obj = (sbyte)0; break;

            case EnumValueTypes.UInt8:
                obj = (byte)0; break;

            case EnumValueTypes.Bool:
                obj = false; break;

            case EnumValueTypes.Int16:
                obj = (short)0; break;

            case EnumValueTypes.UInt16:
                obj = (ushort)0; break;

            case EnumValueTypes.Int32:
                obj = 0; break;

            case EnumValueTypes.UInt32:
                obj = 0u; break;

            case EnumValueTypes.Int64:
                obj = 0L; break;

            case EnumValueTypes.UInt64:
                obj = 0uL; break;

            case EnumValueTypes.Float:
                obj = 0f; break;

            case EnumValueTypes.Double:
                obj = 0d; break;

            case EnumValueTypes.String:
                obj = string.Empty; break;

            case EnumValueTypes.Array:
                obj = new AssetTypeArray(); break;

            case EnumValueTypes.ByteArray:
                obj = new AssetTypeByteArray(); break;

            default:
                obj = null; break;
            }
            return(new AssetTypeValue(templateField.valueType, obj));
        }
        //AssetTypeValueField
        public static void Write(this AssetTypeValueField valueField, AssetsFileWriter writer, int depth = 0)
        {
            if (valueField.templateField.isArray)
            {
                if (valueField.templateField.valueType == EnumValueTypes.ValueType_ByteArray)
                {
                    AssetTypeByteArray byteArray = valueField.value.value.asByteArray;

                    writer.Write(byteArray.size);
                    writer.Write(byteArray.data);
                    if (valueField.templateField.align)
                    {
                        writer.Align();
                    }
                }
                else
                {
                    int size = valueField.value.value.asArray.size;

                    writer.Write(size);
                    for (int i = 0; i < size; i++)
                    {
                        valueField[i].Write(writer, depth + 1);
                    }
                    if (valueField.templateField.align)
                    {
                        writer.Align();
                    }
                }
            }
            else
            {
                if (valueField.childrenCount == 0)
                {
                    switch (valueField.templateField.valueType)
                    {
                    case EnumValueTypes.ValueType_Int8:
                        writer.Write(valueField.value.value.asInt8);
                        if (valueField.templateField.align)
                        {
                            writer.Align();
                        }
                        break;

                    case EnumValueTypes.ValueType_UInt8:
                        writer.Write(valueField.value.value.asUInt8);
                        if (valueField.templateField.align)
                        {
                            writer.Align();
                        }
                        break;

                    case EnumValueTypes.ValueType_Bool:
                        writer.Write(valueField.value.value.asBool);
                        if (valueField.templateField.align)
                        {
                            writer.Align();
                        }
                        break;

                    case EnumValueTypes.ValueType_Int16:
                        writer.Write(valueField.value.value.asInt16);
                        if (valueField.templateField.align)
                        {
                            writer.Align();
                        }
                        break;

                    case EnumValueTypes.ValueType_UInt16:
                        writer.Write(valueField.value.value.asUInt16);
                        if (valueField.templateField.align)
                        {
                            writer.Align();
                        }
                        break;

                    case EnumValueTypes.ValueType_Int32:
                        writer.Write(valueField.value.value.asInt32);
                        break;

                    case EnumValueTypes.ValueType_UInt32:
                        writer.Write(valueField.value.value.asUInt32);
                        break;

                    case EnumValueTypes.ValueType_Int64:
                        writer.Write(valueField.value.value.asInt64);
                        break;

                    case EnumValueTypes.ValueType_UInt64:
                        writer.Write(valueField.value.value.asUInt64);
                        break;

                    case EnumValueTypes.ValueType_Float:
                        writer.Write(valueField.value.value.asFloat);
                        break;

                    case EnumValueTypes.ValueType_Double:
                        writer.Write(valueField.value.value.asDouble);
                        break;

                    case EnumValueTypes.ValueType_String:
                        writer.WriteCountStringInt32(valueField.value.value.asString);
                        writer.Align();
                        break;
                    }
                }
                else
                {
                    for (int i = 0; i < valueField.childrenCount; i++)
                    {
                        valueField[i].Write(writer, depth + 1);
                    }
                    if (valueField.templateField.align)
                    {
                        writer.Align();
                    }
                }
            }
        }
        public static AssetTypeValue DefaultValueFromTemplate(AssetTypeTemplateField templateField)
        {
            object obj;

            switch (templateField.valueType)
            {
            case EnumValueTypes.Int8:
                obj = (sbyte)0; break;

            case EnumValueTypes.UInt8:
                obj = (byte)0; break;

            case EnumValueTypes.Bool:
                obj = false; break;

            case EnumValueTypes.Int16:
                obj = (short)0; break;

            case EnumValueTypes.UInt16:
                obj = (ushort)0; break;

            case EnumValueTypes.Int32:
                obj = 0; break;

            case EnumValueTypes.UInt32:
                obj = 0u; break;

            case EnumValueTypes.Int64:
                obj = 0L; break;

            case EnumValueTypes.UInt64:
                obj = 0uL; break;

            case EnumValueTypes.Float:
                obj = 0f; break;

            case EnumValueTypes.Double:
                obj = 0d; break;

            case EnumValueTypes.String:
                obj = string.Empty; break;

            case EnumValueTypes.Array:
                obj = new AssetTypeArray(); break;

            case EnumValueTypes.ByteArray:
                obj = new AssetTypeByteArray(); break;

            default:
                obj = null; break;
            }
            if (obj == null && templateField.isArray)
            {
                //arrays don't usually have their type set,
                //so we have to check .isArray instead
                obj = new AssetTypeArray();
                return(new AssetTypeValue(EnumValueTypes.Array, obj));
            }
            else
            {
                return(new AssetTypeValue(templateField.valueType, obj));
            }
        }
Exemple #7
0
        private async void BtnSave_Click(object sender, Avalonia.Interactivity.RoutedEventArgs e)
        {
            if (modImageBytes != null)
            {
                TextureFormat fmt           = (TextureFormat)(ddTextureFmt.SelectedIndex + 1);
                byte[]        encImageBytes = TextureEncoderDecoder.Encode(modImageBytes, tex.m_Width, tex.m_Height, fmt);

                if (encImageBytes == null)
                {
                    await MessageBoxUtil.ShowDialog(this, "Error", $"Failed to encode texture format {fmt}");

                    Close(false);
                    return;
                }

                AssetTypeValueField m_StreamData = baseField.Get("m_StreamData");
                m_StreamData.Get("offset").GetValue().Set(0);
                m_StreamData.Get("size").GetValue().Set(0);
                m_StreamData.Get("path").GetValue().Set("");

                baseField.Get("m_Name").GetValue().Set(boxName.Text);

                if (!baseField.Get("m_MipMap").IsDummy())
                {
                    baseField.Get("m_MipMap").GetValue().Set(chkHasMipMaps.IsChecked ?? false);
                }

                if (!baseField.Get("m_MipCount").IsDummy())
                {
                    baseField.Get("m_MipCount").GetValue().Set(1);
                }

                if (!baseField.Get("m_ReadAllowed").IsDummy())
                {
                    baseField.Get("m_ReadAllowed").GetValue().Set(chkIsReadable.IsChecked ?? false);
                }

                AssetTypeValueField m_TextureSettings = baseField.Get("m_TextureSettings");

                m_TextureSettings.Get("m_FilterMode").GetValue().Set(ddFilterMode.SelectedIndex);

                if (int.TryParse(boxAnisotFilter.Text, out int aniso))
                {
                    m_TextureSettings.Get("m_Aniso").GetValue().Set(aniso);
                }

                if (int.TryParse(boxMipMapBias.Text, out int mipBias))
                {
                    m_TextureSettings.Get("m_MipBias").GetValue().Set(mipBias);
                }

                m_TextureSettings.Get("m_WrapU").GetValue().Set(ddWrapModeU.SelectedIndex);
                m_TextureSettings.Get("m_WrapV").GetValue().Set(ddWrapModeV.SelectedIndex);

                if (boxLightMapFormat.Text.StartsWith("0x"))
                {
                    if (int.TryParse(boxLightMapFormat.Text, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out int lightFmt))
                    {
                        baseField.Get("m_LightmapFormat").GetValue().Set(lightFmt);
                    }
                }
                else
                {
                    if (int.TryParse(boxLightMapFormat.Text, out int lightFmt))
                    {
                        baseField.Get("m_LightmapFormat").GetValue().Set(lightFmt);
                    }
                }

                baseField.Get("m_ColorSpace").GetValue().Set(ddColorSpace.SelectedIndex);

                baseField.Get("m_TextureFormat").GetValue().Set((int)fmt);
                baseField.Get("m_CompleteImageSize").GetValue().Set(encImageBytes.Length);

                baseField.Get("m_Width").GetValue().Set(tex.m_Width);
                baseField.Get("m_Height").GetValue().Set(tex.m_Height);

                AssetTypeValueField image_data = baseField.Get("image data");
                image_data.GetValue().type     = EnumValueTypes.ByteArray;
                image_data.templateField.valueType = EnumValueTypes.ByteArray;
                AssetTypeByteArray byteArray = new AssetTypeByteArray()
                {
                    size = (uint)encImageBytes.Length,
                    data = encImageBytes
                };
                image_data.GetValue().Set(byteArray);

                Close(true);
            }
            else
            {
                await MessageBoxUtil.ShowDialog(this, "Error",
                                                "Texture reencoding is not supported atm.\n" +
                                                "If you want to change the texture format,\n" +
                                                "export it to png first then reimport it here.\n" +
                                                "Sorry for the inconvenience.");

                Close(false);
            }
        }