public void RenderAllIcons()
 {
     this.Editor.gameObject.SetActive(true);
     if (!Directory.Exists("c:/test/icons"))
     {
         Directory.CreateDirectory("c:/test/icons");
     }
     Skinnable[] all = Skinnable.All;
     for (int i = 0; i < (int)all.Length; i++)
     {
         Skinnable skinnable = all[i];
         this.Editor.StartNewItem(skinnable.Name);
         PropRenderer.RenderScreenshot(this.Editor.Prefab, string.Concat("c:/test/icons/", skinnable.Name, ".png"), 512, 512, 4);
         int num = 0;
         UnityEngine.Mesh[] meshDownloads = skinnable.MeshDownloads;
         for (int j = 0; j < (int)meshDownloads.Length; j++)
         {
             UnityEngine.Mesh mesh = meshDownloads[j];
             if (mesh != null && mesh.isReadable)
             {
                 mesh.Export(string.Format("c:/test/icons/{0}{1}.obj", skinnable.Name, num));
                 num++;
             }
         }
     }
     this.Editor.gameObject.SetActive(false);
 }
Example #2
0
        private async Task ExportToFolder(string folder, bool OpenFolder)
        {
            Rust.Workshop.Skin.Manifest manifest = new Rust.Workshop.Skin.Manifest()
            {
                ItemType    = this.Skinnable.Name,
                Version     = 3,
                Groups      = new Rust.Workshop.Skin.Manifest.Group[(int)this.Skin.Materials.Length],
                PublishDate = DateTime.UtcNow,
                AuthorId    = SteamClient.SteamId
            };
            Rust.Workshop.Skin.Manifest group = manifest;
            for (int i = 0; i < (int)this.Skin.Materials.Length; i++)
            {
                group.Groups[i] = new Rust.Workshop.Skin.Manifest.Group();
                await this.ExportTexture(group.Groups[i].Textures, folder, i, "_MainTex", this.Skin.Materials[i], this.Skin.DefaultMaterials[i], false);

                await this.ExportTexture(group.Groups[i].Textures, folder, i, "_OcclusionMap", this.Skin.Materials[i], this.Skin.DefaultMaterials[i], false);

                await this.ExportTexture(group.Groups[i].Textures, folder, i, "_SpecGlossMap", this.Skin.Materials[i], this.Skin.DefaultMaterials[i], false);

                await this.ExportTexture(group.Groups[i].Textures, folder, i, "_BumpMap", this.Skin.Materials[i], this.Skin.DefaultMaterials[i], true);

                await this.ExportTexture(group.Groups[i].Textures, folder, i, "_EmissionMap", this.Skin.Materials[i], this.Skin.DefaultMaterials[i], false);

                group.Groups[i].Floats.Add("_Cutoff", this.Skin.Materials[i].GetFloat("_Cutoff"));
                group.Groups[i].Floats.Add("_BumpScale", this.Skin.Materials[i].GetFloat("_BumpScale"));
                group.Groups[i].Floats.Add("_Glossiness", this.Skin.Materials[i].GetFloat("_Glossiness"));
                group.Groups[i].Floats.Add("_OcclusionStrength", this.Skin.Materials[i].GetFloat("_OcclusionStrength"));
                if (this.Skin.Materials[i].shader.name.Contains("Cloth"))
                {
                    group.Groups[i].Floats.Add("_MicrofiberFuzzIntensity", this.Skin.Materials[i].GetFloat("_MicrofiberFuzzIntensity"));
                    group.Groups[i].Floats.Add("_MicrofiberFuzzScatter", this.Skin.Materials[i].GetFloat("_MicrofiberFuzzScatter"));
                    group.Groups[i].Floats.Add("_MicrofiberFuzzOcclusion", this.Skin.Materials[i].GetFloat("_MicrofiberFuzzOcclusion"));
                }
                group.Groups[i].Colors.Add("_Color", new Rust.Workshop.Skin.Manifest.ColorEntry(this.Skin.Materials[i].GetColor("_Color")));
                group.Groups[i].Colors.Add("_SpecColor", new Rust.Workshop.Skin.Manifest.ColorEntry(this.Skin.Materials[i].GetColor("_SpecColor")));
                group.Groups[i].Colors.Add("_EmissionColor", new Rust.Workshop.Skin.Manifest.ColorEntry(this.Skin.Materials[i].GetColor("_EmissionColor")));
                if (this.Skin.Materials[i].shader.name.Contains("Cloth"))
                {
                    group.Groups[i].Colors.Add("_MicrofiberFuzzColor", new Rust.Workshop.Skin.Manifest.ColorEntry(this.Skin.Materials[i].GetColor("_MicrofiberFuzzColor")));
                }
            }
            PropRenderer.RenderScreenshot(this.Prefab, string.Concat(folder, "/icon.png"), 512, 512, 4);
            this.CreateWorkshopIcon(folder);
            string str = JsonConvert.SerializeObject(group, Formatting.Indented);

            File.WriteAllText(string.Concat(folder, "/manifest.txt"), str);
            if (OpenFolder)
            {
                Os.OpenFolder(folder);
            }
        }
Example #3
0
    public void Initialize()
    {
        if (!_isInitialized)
        {
            if (_openEditor == null)
            {
                _openEditor = new Subject <Unit>();
            }
            if (_closeEditor == null)
            {
                _closeEditor = new Subject <Unit>();
            }
            if (_disposables == null)
            {
                _disposables = new CompositeDisposable();
            }

            // Get the Gui camera, this will break in Oculus mode
            var cameraMovement = _spectatorCamera;

            var cameraTransform = new Ref <ImmutableTransform>(
                () => cameraMovement.transform.MakeImmutable(),
                transform => cameraMovement.transform.Set(transform));

            var isCourseEditorOpen = _openEditor.Select(_ => true)
                                     .Merge(_closeEditor.Select(_ => false))
                                     .StartWith(false);

            var courseStorageActions  = new CourseStorageActions();
            var courseSelectorActions = new CourseSelectorActions();
            var courseEditorActions   = new CourseEditorActions();
            var closeCurrentCourse    = new Subject <Unit>();

            var fileStorage = CoursesFileStorage.CourseUpdater(courseStorageActions, CoursesFileStorage.CoursesDir.Value);
            _disposables.Add(fileStorage);

            var customCourses = CoursesFileStorage.CustomCourses.Value
                                .ObserveOn(UnityThreadScheduler.MainThread);
            var courseSelectorStore = CourseSelectorStore.Create(courseSelectorActions, customCourses, isCourseEditorOpen);
            _disposables.Add(courseSelectorStore.Connect());
            var courseEditorStore = CourseSelectorStore.CreateCourseEditorStore(
                course => CourseEditorStore.Create(courseEditorActions, course, cameraTransform),
                courseSelectorStore.Select(s => {
                if (s.SelectedCourse.IsJust)
                {
                    return(s.AvailableCourses.Find(c => c.Id.Equals(s.SelectedCourse.Value)));
                }
                return(Maybe.Nothing <CourseData>());
            }));
            _disposables.Add(courseEditorStore.Connect());

            _disposables.Add(_openEditor.Subscribe(_ => _courseEditorGui.Show()));
            _disposables.Add(closeCurrentCourse
                             .WithLatestFrom(courseEditorStore, (_, finalCourseState) => finalCourseState)
                             .Subscribe(finalCourseState => {
                // Storing course changes to disk
                Debug.Log("deselecting a course");
                courseStorageActions.UpdateCourse.OnNext(finalCourseState.ToSerializableFormat());

                courseSelectorActions.DeselectCourse.OnNext(Unit.Default);
            }));

            // Initialize input for course editor store
            var propRenderer = new PropRenderer <PropId>(propId => "__CourseEditor-" + propId);
            // Clear the prop renderer when done editing
            _disposables.Add(courseEditorStore.Subscribe(_ => propRenderer.Clear()));
            CourseEditorInput.InitializeCourseEditor(courseEditorActions, courseEditorStore, _gameCamera, cameraTransform, _renderableProps, propRenderer, _clock);

            _courseEditorGui.CourseStorageActions  = courseStorageActions;
            _courseEditorGui.CourseEditorActions   = courseEditorActions;
            _courseEditorGui.CourseSelectorActions = courseSelectorActions;
            _courseEditorGui.CourseEditorChanges   = courseEditorStore;
            _courseEditorGui.CourseSelectorChanges = courseSelectorStore;
            _courseEditorGui.CloseCurrentCourse    = closeCurrentCourse;
            _courseEditorGui.CloseEditor           = _closeEditor;
            _courseEditorGui.ActiveLanguage        = _activeLanguage;
            _courseEditorGui.Initialize();

            var rightMouseButtonPressed = UnityObservable.CreateUpdate <bool>(observer => {
                if (Input.GetMouseButtonDown(1))
                {
                    observer.OnNext(true);
                }
                else if (Input.GetMouseButtonUp(1))
                {
                    observer.OnNext(false);
                }
            });

            _disposables.Add(courseSelectorStore
                             .CombineLatest(isCourseEditorOpen, rightMouseButtonPressed, (state, isOpen, isRightMouseButtonIsPressed) => {
                return(state.SelectedCourse.IsJust && isOpen && isRightMouseButtonIsPressed);
            })
                             .StartWith(false)
                             .Subscribe(isMovementEnabled => {
                if (isMovementEnabled)
                {
                    cameraMovement.EnableInputProcessing();
                }
                else
                {
                    cameraMovement.DisableInputProcessing();
                }
            }));

            _disposables.Add(_closeEditor.Subscribe(_ => {
                _courseEditorGui.Hide();
                propRenderer.Clear();
            }));

            _isInitialized = true;
        }
    }