diff --git a/.github/workflows/ff-release.yml b/.github/workflows/ff-release.yml new file mode 100644 index 0000000..b849130 --- /dev/null +++ b/.github/workflows/ff-release.yml @@ -0,0 +1,23 @@ +name: Fast-Forward Release Branch +on: + release: + types: [created] + +jobs: + fast-forward: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + with: + ref: release + fetch-depth: 0 + + - name: Merge into Release + run: git merge ${{github.ref_name}} --ff-only + + - name: Push Changes + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: release \ No newline at end of file diff --git a/.github/workflows/ksp-publish.yml b/.github/workflows/ksp-publish.yml new file mode 100644 index 0000000..de7ff87 --- /dev/null +++ b/.github/workflows/ksp-publish.yml @@ -0,0 +1,139 @@ +name: Build and Release +on: [ push ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Setup Python + uses: actions/setup-python@v2 + with: + python-version: '3.x' + + - name: Setup .NET Core SDK + uses: actions/setup-dotnet@v1.7.2 + with: + dotnet-version: '6.0.x' + + - name: Install Python Tools + run: | + python -m pip install --upgrade pip + python -m pip install yaclog yaclog-ksp + + - name: Generate Version Info + run: | + echo "VERSION_TITLE=$(yaclog show -n)" >> $GITHUB_ENV + python Scripts/version.py + yaclog-ksp -n "Conformal Decals" + + - name: Validate Version Info + uses: DasSkelett/AVC-VersionFileValidator@master + + - name: Download DLL Dependencies + working-directory: Source + run: | + wget --user drewcassidy --password ${{ secrets.PILE_OF_ROCKS_PASS }} https://pileof.rocks/Secret/conformal-decals-dependencies-1.zip + unzip conformal-decals-dependencies-*.zip -d ConformalDecals/dlls + + - name: Build DLL + working-directory: Source + run: | + mkdir -p ../GameData/ConformalDecals/Plugins + dotnet build --configuration Release ConformalDecals.sln + + - name: Download KSP Dependencies + run: | + wget http://pileof.rocks/KSP/Shabby_v0.2.0.zip + wget https://ksp.sarbian.com/jenkins/job/ModuleManager/161/artifact/ModuleManager.4.2.1.dll + wget https://github.com/blowfishpro/B9PartSwitch/releases/download/v2.19.0/B9PartSwitch_v2.19.0.zip + wget https://github.com/KSPModdingLibs/HarmonyKSP/releases/download/2.0.4.0/HarmonyKSP_2.0.4.0_for_KSP1.8+.zip + unzip -d Shabby Shabby*.zip + unzip -d B9PartSwitch B9PartSwitch*.zip + unzip -d HarmonyKSP HarmonyKSP*.zip + mv Shabby/GameData/Shabby GameData/ + mv ModuleManager*.dll GameData/ + mv B9PartSwitch/GameData/B9PartSwitch GameData/ + mv HarmonyKSP/GameData/000_Harmony GameData/ + + - name: Upload Unbundled Build + uses: actions/upload-artifact@v3 + with: + name: ConformalDecals-unbundled + path: | + GameData/ConformalDecals + README.md + CHANGELOG.md + LICENSE-ART.md + LICENSE-SOURCE.md + + - name: Upload Bundled Build + uses: actions/upload-artifact@v3 + with: + name: ConformalDecals + path: | + GameData + README.md + CHANGELOG.md + LICENSE-ART.md + LICENSE-SOURCE.md + + + deploy: + needs: build + runs-on: ubuntu-latest + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') + + steps: + - uses: actions/checkout@v2 + + - name: Set up Python + uses: actions/setup-python@v2 + with: + python-version: '3.x' + + - name: Install Python Tools + run: | + python -m pip install --upgrade pip + python -m pip install yaclog + + - name: Get version name and body + run: | + echo "VERSION_TITLE=$(yaclog show -n)" >> $GITHUB_ENV + echo "$(yaclog show -mb)" >> RELEASE.md + + - name: Download Build Artifacts + uses: actions/download-artifact@v3 + + - name: Zip Download Packages + run: | + mkdir bundled + mkdir unbundled + zip -r bundled/ConformalDecals-$VERSION_TITLE.zip ConformalDecals/* + zip -r unbundled/ConformalDecals-$VERSION_TITLE.zip ConformalDecals-unbundled/* + ls + + - name: Publish to Spacedock + run: | + curl -F "username=drewcassidy" -F "password=${{ secrets.SPACEDOCK_PASS }}" \ + -c ./cookies "https://spacedock.info/api/login" + curl -c ./cookies -b ./cookies \ + -F "version=$VERSION_TITLE" \ + -F "changelog=$(yaclog show -mb)" \ + -F "game-version=1.12.3" \ + -F "notify-followers=yes" \ + -F "zipball=@bundled/ConformalDecals-$VERSION_TITLE.zip" \ + "https://spacedock.info/api/mod/2451/update" + + - name: Publish to Github + uses: softprops/action-gh-release@v1 + with: + files: | + bundled/ConformalDecals-*.zip + ConformalDecals/GameData/ConformalDecals/Versioning/ConformalDecals.version + name: Conformal Decals ${{ env.VERSION_TITLE }} + body_path: RELEASE.md + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 7154405..dda105b 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,9 @@ Temp/ GameData/ConformalDecals/Resources/Resources GameData/ConformalDecals/Resources/*.manifest +# DLLs +GameData/ConformalDecals/Plugins + # Unity Project Files PartTools.cfg *.meta @@ -52,4 +55,4 @@ Source/ConformalDecals/bin .vs obj *.swp -Source/.editorconfig +@thumbs diff --git a/.mod_data.yml b/.mod_data.yml index b4e3a45..2203f35 100644 --- a/.mod_data.yml +++ b/.mod_data.yml @@ -16,11 +16,15 @@ dependencies: # Configure dependencies zip: false B9PartSwitch: location: url - url: http://pileof.rocks/KSP/B9PartSwitch-v2.16.0.zip + url: http://pileof.rocks/KSP/B9PartSwitch-v2.18.0.zip zip: true Shabby: location: url - url: http://taniwha.org/~bill/Shabby_v0.1.2.zip + url: http://pileof.rocks/KSP/Shabby_v0.2.0.zip + zip: true + HarmonyKSP: + location: url + url: https://github.com/KSPModdingLibs/HarmonyKSP/releases/download/2.0.4.0/HarmonyKSP_2.0.4.0_for_KSP1.8+.zip zip: true deploy: SpaceDock: diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 33780f4..0000000 --- a/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -language: python -python: - - 3.6 -before_install: - - echo -e "machine github.com\n login $GITHUB_OAUTH_TOKEN" > ~/.netrc -install: - - pip install awscli boto3 requests -branches: - only: - - release -script: - - git clone https://github.com/post-kerbin-mining-corporation/build-deploy.git - - cd build-deploy - - git checkout master - - cd .. - - pytest -s --testpath "GameData/" build-deploy/src/tests/ # run the deploy tests - - python build-deploy/src/package.py --f ".mod_data.yml" # Build package -before_deploy: - - python build-deploy/src/stage.py --f ".mod_data.yml" # Run the staging script -deploy: - - provider: script - script: python build-deploy/src/deploy.py --f ".mod_data.yml" # Deploy package to spacedock, curse, github - skip_cleanup: true - on: - branch: release diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..de608e4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,193 @@ +# Changelog + +All notable changes to this project will be documented in this file + +| modName | Conformal Decals | +| ------- |:-------------------------------------------------------------------------------------| +| license | CC-By-SA & GPL3 | +| website | https://forum.kerbalspaceprogram.com/index.php?/topic/194802-18-111-conformal-decals | +| author | Andrew Cassidy | + +## 0.2.10 - 2022-03-14 + +### Fixed + +- Fixed decals not projecting on loading prefabs + +### Changed + +- Re-enabled projecting onto TransparentFX layer + +### Added + +- Allowed for regular expressions to be used when blacklisting shaders +- Added all Waterfall shaders to the shader blacklist when Waterfall is present + + +## 0.2.9 - 2022-03-12 + +### Fixed + +- Fixed text decals breaking when used in symmetry +- Fixed decals projecting onto the TransparentFX layer, such as Waterfall plumes + + +## 0.2.8 + +- Update bundled Shabby to support Harmony 2 for compatibility with other mods +- Update bundled B9PartSwitch to 2.18.0 + + +## 0.2.7 + +- Supported KSP versions: 1.8.x to 1.11.x + +### Notes: + +- Attaching decal parts in flight using engineer kerbals is not supported. + +### Fixed: + +- Fixed certain non-ascii strings not rendering correctly under certain circumstances. +- Yet another attempted fix for the planet text glitch. + + +## 0.2.6 + +### Fixed: + +- Fixed stock flags appearing stretched by forcing their aspect ratio to be correct. +- Another attempted fix for the planet text glitch. + + +## 0.2.5 + +### Fixed: + +- Fixed line spacing, character spacing, and vertical settings not applying to symmetry counterparts + + +## 0.2.4 + +### Fixed: + +- Fixed red text appearing on planets due to KSP bug by clearing render textures afterwards. +- Fixed fonts not saving correctly. + +### Changed: + +- Lowered step size for decal size and depth to 1cm. +- Changed default max size to 5m. +- Changed default text decal size to 0.2m +- Text decals now show as a circle if they contain only whitespace. + + +## 0.2.3 + +### Fixed: + +- Fixed TMP subobjects being deleted, causing fallback fonts to fail in some situations. +- Started using URL-style encoding for text decals behind the scenes to prevent issues with certain characters. +- Fixed text decals having zero size when they had only whitespace or an empty string. +- Fixed decals having drag and causing issues when using FAR. +- Fixed broken saving of text decals in certain circumstances. + + +## 0.2.2 + +### Fixed: + +- Fixed corrupted text rendering when a vessel loads during a scene change. + + +## 0.2.1 + +### Changed: + +- Pressing enter in the text entry window now types a newline. + +### Fixed: + +- Renamed font assetbundle. The old extension was causing the game to try to load it twice on Windows due to legacy compatability features. +- Fixed text rendering on DirectX resulting in black boxes by using ARGB32 instead of RG16 for the render texture in DirectX. + + +## 0.2.0 + +### New Parts: + +- CDL-3 Surface Base Decal: A set of conformal decals based on the symbols from the movie Moon (2009) designed by Gavin Rothery +- CDL-T Custom Text Decal: A customizable text decal with a variety of fonts + +### Changed: + +- New ModuleConformalText module for customizable text +- Text, font, and style can all be customized, as well as text fill and outline colors and widths +- Same projection and opacity options as other conformal decals +- New StandardText decal shader supporting the text module +- Unified all decal shaders into a single "StandardDecal" shader with variants supporting any combination of bump, specular and emissive maps, plus SDF alphas. +- Old shaders are remapped to Standard shader plus keywords automatically. +- New SDF-based antialiasing for when decals extend to their borders, e.g. on opaque flags. +- New "KEYWORD" material modifier, allowing for shader features to be enabled and disabled. +- Material modifiers can now be removed in variants by setting `remove = true` inside them. + +### Fixed: + +- Fixed WIDTH and HEIGHT scale modes being flipped +- Removed some debug log statements +- Dependencies: +- Updated ModuleManager to version 4.1.4 + + +## 0.1.4 + +Supported KSP versions: 1.8.x to 1.10.x + +### Fixed: + +- Fixed decals rendering onto disabled B9PS part variants + - Decals will still not update whan their parent part's B9PS variant is changed, both in flight and in the editor. This is known and awaiting a change to B9PS to be fixed. +- Fixed decal bounds rendering as dark cubes when shadowed by EVE clouds. +- Fixed decals being shadowed by EVE clouds, causing the part underneath to appear overly dark. + + +## 0.1.3 + +### Fixe: + +- Fixed decals being able to be scaled down to 0 + +### Changed: + +- Made decal bounds no longer collide in flight, this is done by repurposing layer 31 (which is configurable in the ConformalDecals.cfg file) +- Decals will now be unselectable in flight by default. This can be disabled with the `selectableInFlight` value in ConformalDecals.cfg, or in the module config itself. +- Decal parts will now destroy themselves automatically when the parent part is destroyed +- Small refactor of node parsing code + - Colors can now be specified in hex (#RGB, #RGBA, #RRGGBB, or #RRGGBBAA) or using the colors specified in the XKCDColors class + + +## 0.1.2 + +### Fixed: + +- Disabled writing to the zbuffer in the decal bounds shader. Should fix any issues with Scatterer or EVE. + + +## 0.1.1 + +### Fixed: + +- Fixed flag decal not adjusting to new texture sizes immediately. +- Fixed decal bounds being visible on launch. +- Fixed decal bounds being visible in the part icon. + + +## 0.1.0 + +Initial release! + +### New Parts: + +- CDL-F Flag Decal: Conformal flag decal, which uses either the mission flag or a flag of your choosing. +- CDL-1 Generic Decal: A set of conformal generic decals for planes and rockets +- CDL-2 Semiotic Standard Decal: A set of conformal decals based on the Semiotic Standard for All Commercial Trans-Stellar Utility Lifter and Transport Spacecraft designed by Ron Cobb for the movie Alien \ No newline at end of file diff --git a/GameData/ConformalDecals/Patches/Waterfall.cfg b/GameData/ConformalDecals/Patches/Waterfall.cfg new file mode 100644 index 0000000..f3e06e6 --- /dev/null +++ b/GameData/ConformalDecals/Patches/Waterfall.cfg @@ -0,0 +1,7 @@ +// Prevent projection onto Waterfall plumes + +CONFORMALDECALS:NEEDS[Waterfall] { + SHADERBLACKLIST { + shaderRegex = Waterfall/.* + } +} diff --git a/GameData/ConformalDecals/Plugins/ConformalDecals.dll b/GameData/ConformalDecals/Plugins/ConformalDecals.dll deleted file mode 100644 index d3d445b..0000000 Binary files a/GameData/ConformalDecals/Plugins/ConformalDecals.dll and /dev/null differ diff --git a/GameData/ConformalDecals/Resources/ConformalDecals.cfg b/GameData/ConformalDecals/Resources/ConformalDecals.cfg index 0057e17..e868a65 100644 --- a/GameData/ConformalDecals/Resources/ConformalDecals.cfg +++ b/GameData/ConformalDecals/Resources/ConformalDecals.cfg @@ -4,21 +4,13 @@ CONFORMALDECALS { SHADERBLACKLIST { shader = DepthMask - shader = KSP/Alpha/Cutoff - shader = KSP/Alpha/Cutoff Bumped - shader = KSP/Alpha/Translucent - shader = KSP/Alpha/Translucent Additive - shader = KSP/Alpha/Translucent Specular - shader = KSP/Alpha/Unlit Transparent shader = KSP/Bumped Specular (Transparent) shader = KSP/FX/ScrollingUnlit - shader = KSP/Particles/Additive - shader = KSP/Particles/Additive (Soft) - shader = KSP/Particles/Alpha Blended - shader = KSP/Particles/Alpha Blended Emissive Cutout shader = KSP/Specular (Cutoff) shader = KSP/Specular (Transparent) shader = Solid Color (Alpha) + shaderRegex = KSP/Alpha/.* + shaderRegex = KSP/Particles/.* } FONT { diff --git a/GameData/ConformalDecals/Versioning/ConformalDecals.version b/GameData/ConformalDecals/Versioning/ConformalDecals.version index b68583a..e7050ee 100644 --- a/GameData/ConformalDecals/Versioning/ConformalDecals.version +++ b/GameData/ConformalDecals/Versioning/ConformalDecals.version @@ -1,28 +1,24 @@ { - "NAME":"ConformalDecals", - "URL":"https://raw.githubusercontent.com/drewcassidy/KSP-Conformal-Decals/release/GameData/ConformalDecals/Versioning/ConformalDecals.version", - "DOWNLOAD":"https://github.com/drewcassidy/KSP-Conformal-Decals/releases", - "VERSION": - { - "MAJOR":0, - "MINOR":2, - "PATCH":7, - "BUILD":0 + "NAME": "ConformalDecals", + "URL": "https://github.com/drewcassidy/KSP-Conformal-Decals/releases/latest/download/ConformalDecals.version", + "DOWNLOAD": "https://github.com/drewcassidy/KSP-Conformal-Decals/releases/latest", + "CHANGE_LOG_URL": "https://raw.githubusercontent.com/drewcassidy/KSP-Conformal-Decals/release/CHANGELOG.md", + "VERSION": { + "MAJOR": 9, + "MINOR": 9, + "PATCH": 9, + "BUILD": 100000 }, - "KSP_VERSION": - { - "MAJOR":1, - "MINOR":11, - "PATCH":0 + "KSP_VERSION": { + "MAJOR": 1, + "MINOR": 12 }, - "KSP_VERSION_MIN":{ - "MAJOR":1, - "MINOR":8, - "PATCH":0 + "KSP_VERSION_MIN": { + "MAJOR": 1, + "MINOR": 8 }, - "KSP_VERSION_MAX":{ - "MAJOR":1, - "MINOR":11, - "PATCH":99 + "KSP_VERSION_MAX": { + "MAJOR": 1, + "MINOR": 12 } -} +} \ No newline at end of file diff --git a/README.md b/README.md index 11dcb47..9d20db2 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -# Conformal Decals v0.2.7 -[![Build Status](https://travis-ci.com/drewcassidy/KSP-Conformal-Decals.svg?branch=release)](https://travis-ci.com/drewcassidy/KSP-Conformal-Decals) [![Art: CC BY-SA 4.0](https://img.shields.io/badge/Art%20License-CC%20BY--SA%204.0-orange.svg)](https://creativecommons.org/licenses/by-sa/4.0/) [![Code: GPL v3](https://img.shields.io/badge/Code%20License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) +# Conformal Decals +[![Art: CC BY-SA 4.0](https://img.shields.io/badge/Art%20License-CC%20BY--SA%204.0-orange.svg)](https://creativecommons.org/licenses/by-sa/4.0/) [![Code: GPL v3](https://img.shields.io/badge/Code%20License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) ![Screenshot](http://pileof.rocks/KSP/images/ConformalDecalsHeader.png) @@ -9,9 +9,10 @@ Conformal Decals adds a set of decal stickers to KSP, as well as providing a fra Required: - KSP (1.8.x to 1.10.x) -- B9 Part Switch (2.16.0). Bundled with release. +- B9 Part Switch (2.18.0). Bundled with release. - ModuleManager (4.1.4). Bundled with release. -- Shabby (0.1.2). Bundled with release. +- Shabby (0.2.0 unofficial build). Bundled with release. +- HarmonyKSP (2.0.4.0). Bundled with release. Optional: - Wild Blue Tools. For custom decals category in the VAB and SPH. diff --git a/Scripts/version.py b/Scripts/version.py new file mode 100644 index 0000000..45f686f --- /dev/null +++ b/Scripts/version.py @@ -0,0 +1,61 @@ +import yaclog +import yaclog.version +import git as gp +import os +import xml.dom.minidom as minidom +import json + + +def run(): + repo = gp.Repo(os.curdir) + cl = yaclog.Changelog('CHANGELOG.md') + version = str(cl.current_version(released=True).version) + release = False + + for tag in repo.tags: + if tag.commit == repo.head.commit: + release = True + build = 100000 + break + + if not release: + build = int.from_bytes(repo.head.commit.binsha[0:2], byteorder='big') + version = yaclog.version.increment_version(version, 2) + + print(f'Setting up version {version} build {build}') + + version_path = 'GameData/ConformalDecals/Versioning/ConformalDecals.version' + with open(version_path, 'r+') as version_file: + print('Updating version file') + segments = version.split('.') + # print(version_file.read()) + decoded = json.load(version_file) + decoded['VERSION']['MAJOR'] = int(segments[0]) + decoded['VERSION']['MINOR'] = int(segments[1]) + decoded['VERSION']['PATCH'] = int(segments[2]) + decoded['VERSION']['BUILD'] = build + + version_file.seek(0) + json.dump(decoded, version_file, indent=4) + version_file.truncate() + + project_path = 'Source/ConformalDecals/ConformalDecals.csproj' + with open(project_path, 'r+') as project_file: + print('Updating csproj file') + segments = version.split('.') + decoded = minidom.parse(project_file) + version_node = decoded.getElementsByTagName('AssemblyVersion')[0] + if release: + version_node.firstChild.nodeValue = f'{version}' + else: + version_node.firstChild.nodeValue = f'{version}.{build}' + # version_node.value = f'{version}.{build}' + project_file.seek(0) + decoded.writexml(project_file) + project_file.truncate() + + print('Done!') + + +if __name__ == '__main__': + run() diff --git a/Source/ConformalDecals/ConformalDecals.csproj b/Source/ConformalDecals/ConformalDecals.csproj index b511e08..ff77c09 100644 --- a/Source/ConformalDecals/ConformalDecals.csproj +++ b/Source/ConformalDecals/ConformalDecals.csproj @@ -1,11 +1,11 @@ - + net48 8 false x64 1701;1702;CS0649;CS1591 - 0.2.7 + 9.9.9 @@ -36,23 +36,23 @@ - + - + - + - + + - diff --git a/Source/ConformalDecals/DecalConfig.cs b/Source/ConformalDecals/DecalConfig.cs index ce15477..3febe59 100644 --- a/Source/ConformalDecals/DecalConfig.cs +++ b/Source/ConformalDecals/DecalConfig.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Text.RegularExpressions; using ConformalDecals.Text; using ConformalDecals.Util; using TMPro; @@ -9,6 +10,7 @@ namespace ConformalDecals { public static class DecalConfig { private static Texture2D _blankNormal; private static List _shaderBlacklist; + private static List _shaderRegexBlacklist; private static Dictionary _fontList; private static int _decalLayer = 31; private static bool _selectableInFlight; @@ -55,7 +57,17 @@ namespace ConformalDecals { } public static bool IsBlacklisted(string shaderName) { - return _shaderBlacklist.Contains(shaderName); + if (_shaderBlacklist.Contains(shaderName)) return true; + + foreach (var regex in _shaderRegexBlacklist) { + if (regex.IsMatch(shaderName)) { + _shaderBlacklist.Add(shaderName); + Logging.Log($"Caching blacklisted shader name '{shaderName}' which matches '{regex}'"); + return true; + } + } + + return false; } public static bool IsLegacy(string shaderName, out string newShader, out string[] keywords) { @@ -88,6 +100,10 @@ namespace ConformalDecals { foreach (var shaderName in blacklist.GetValuesList("shader")) { _shaderBlacklist.Add(shaderName); } + + foreach (var shaderRegex in blacklist.GetValuesList("shaderRegex")) { + _shaderRegexBlacklist.Add(new Regex(shaderRegex)); + } } var allFonts = Resources.FindObjectsOfTypeAll(); @@ -121,13 +137,14 @@ namespace ConformalDecals { // ReSharper disable once UnusedMember.Global public static void ModuleManagerPostLoad() { _shaderBlacklist = new List(); + _shaderRegexBlacklist = new List(); _fontList = new Dictionary(); var configs = GameDatabase.Instance.GetConfigs("CONFORMALDECALS"); if (configs.Length > 0) { - Logging.Log("Loading config"); foreach (var config in configs) { + Logging.Log($"loading config node '{config.url}'"); ParseConfig(config.config); } } @@ -143,4 +160,4 @@ namespace ConformalDecals { _blankNormal = MakeBlankNormal(); } } -} \ No newline at end of file +} diff --git a/Source/ConformalDecals/ModuleConformalDecal.cs b/Source/ConformalDecals/ModuleConformalDecal.cs index fa4636b..f0825f6 100644 --- a/Source/ConformalDecals/ModuleConformalDecal.cs +++ b/Source/ConformalDecals/ModuleConformalDecal.cs @@ -441,12 +441,14 @@ namespace ConformalDecals { } } - /// Setup decal by calling update functions relevent for the current situation - protected virtual void SetupDecal() { - if (HighLogic.LoadedSceneIsEditor) { - // Update tweakables in editor mode - UpdateTweakables(); - } + // find all valid renderers + var renderers = part.parent.FindModelComponents(); + foreach (var renderer in renderers) { + // skip disabled renderers + if (renderer.gameObject.activeInHierarchy == false) continue; + + // skip blacklisted shaders + if (DecalConfig.IsBlacklisted(renderer.material.shader)) continue; if (HighLogic.LoadedSceneIsGame) { UpdateAll(); @@ -671,4 +673,4 @@ namespace ConformalDecals { } } } -} \ No newline at end of file +} diff --git a/Source/ConformalDecals/ModuleConformalFlag.cs b/Source/ConformalDecals/ModuleConformalFlag.cs index 857f56f..4729fcb 100644 --- a/Source/ConformalDecals/ModuleConformalFlag.cs +++ b/Source/ConformalDecals/ModuleConformalFlag.cs @@ -22,35 +22,64 @@ namespace ConformalDecals { return string.IsNullOrEmpty(part.flagURL) ? HighLogic.CurrentGame.flagURL : part.flagURL; } + // If we are not in game, use the default flag (for icon rendering) return DefaultFlag; } } + public override void OnLoad(ConfigNode node) { + base.OnLoad(node); + + // Since OnLoad is called for all modules, we only need to update this module + // Updating symmetry counterparts would be redundent + UpdateFlag(); + } + public override void OnStart(StartState state) { base.OnStart(state); - if (HighLogic.LoadedSceneIsGame) { - GameEvents.onMissionFlagSelect.Add(OnEditorFlagSelected); - } - if (HighLogic.LoadedSceneIsEditor) { + // Register flag change event + GameEvents.onMissionFlagSelect.Add(OnEditorFlagSelected); + + // Register reset button event Events[nameof(ResetFlag)].guiActiveEditor = useCustomFlag; } + + // Since OnStart is called for all modules, we only need to update this module + // Updating symmetry counterparts would be redundent + UpdateFlag(); } public override void OnDestroy() { - GameEvents.onMissionFlagSelect.Remove(OnEditorFlagSelected); + if (HighLogic.LoadedSceneIsEditor) { + // Unregister flag change event + GameEvents.onMissionFlagSelect.Remove(OnEditorFlagSelected); + } + base.OnDestroy(); } [KSPEvent(guiActive = false, guiActiveEditor = true, guiName = "#LOC_ConformalDecals_gui-select-flag")] public void SelectFlag() { - var flagBrowser = (Instantiate((Object) (new FlagBrowserGUIButton(null, null, null, null)).FlagBrowserPrefab) as GameObject)?.GetComponent(); - if (flagBrowser is { }) flagBrowser.OnFlagSelected = OnCustomFlagSelected; + // Button for selecting a flag + // This is a bit of a hack to bring up the stock flag selection menu + // When its done, it calls OnCustomFlagSelected() + + // ReSharper disable once PossibleNullReferenceException + var flagBrowser = (Instantiate((Object) (new FlagBrowserGUIButton(null, null, null, null)).FlagBrowserPrefab) as GameObject).GetComponent(); + flagBrowser.OnFlagSelected = OnCustomFlagSelected; } [KSPEvent(guiActive = false, guiActiveEditor = true, guiName = "#LOC_ConformalDecals_gui-reset-flag")] public void ResetFlag() { + + // we are no longer using a custom flag, so instead use the mission or agency flag + useCustomFlag = false; + flagUrl = "Mission"; + UpdateFlag(true); + + // disable the reset button, since it no longer makes sense Events[nameof(ResetFlag)].guiActiveEditor = false; flagUrl = MissionFlagUrl; useCustomFlag = false; @@ -64,33 +93,55 @@ namespace ConformalDecals { } private void OnCustomFlagSelected(FlagBrowser.FlagEntry newFlagEntry) { + // Callback for when a flag is selected in the menu spawned by SelectFlag() + + // we are now using a custom flag with the URL of the new flag entry + useCustomFlag = true; + flagUrl = newFlagEntry.textureInfo.name; + UpdateFlag(true); + + // make sure the reset button is now available Events[nameof(ResetFlag)].guiActiveEditor = true; flagUrl = newFlagEntry.textureInfo.name; useCustomFlag = true; UpdateAll(); - foreach (var decal in part.symmetryCounterparts.Select(o => o.GetComponent())) { - decal.Events[nameof(ResetFlag)].guiActiveEditor = true; - decal.flagUrl = flagUrl; - decal.useCustomFlag = true; - decal.UpdateAll(); - } - } - private void OnEditorFlagSelected(string newFlagUrl) { - if (!useCustomFlag) UpdateAll(); + if (!useCustomFlag) { + flagUrl = newFlagUrl; + // Since this callback is called for all modules, we only need to update this module + // Updating symmetry counterparts would be redundent + UpdateFlag(); + } } - protected override void UpdateTextures() { - _flagTextureProperty ??= materialProperties.AddOrGetTextureProperty("_Decal", true); - - base.UpdateTextures(); - if (useCustomFlag) { - _flagTextureProperty.TextureUrl = flagUrl; + // Update the displayed flag texture for this decal or optionally any symmetry counterparts + private void UpdateFlag(bool recursive = false) { + // get the decal material property for the decal texture + var textureProperty = materialProperties.AddOrGetTextureProperty("_Decal", true); + + if(useCustomFlag) { + // set the texture to the custom flag + textureProperty.TextureUrl = flagUrl; } else { - _flagTextureProperty.TextureUrl = MissionFlagUrl; + // set the texture to the mission flag + textureProperty.TextureUrl = MissionFlagUrl; + } + + UpdateMaterials(); + UpdateScale(); + + if (recursive) { + // for each symmetry counterpart, copy this part's properties and update it in turn + foreach (var counterpart in part.symmetryCounterparts) { + var decal = counterpart.GetComponent(); + + decal.useCustomFlag = useCustomFlag; + decal.flagUrl = flagUrl; + decal.UpdateFlag(); + } } } } -} \ No newline at end of file +} diff --git a/Source/ConformalDecals/ModuleConformalText.cs b/Source/ConformalDecals/ModuleConformalText.cs index 56e0d88..89628c1 100644 --- a/Source/ConformalDecals/ModuleConformalText.cs +++ b/Source/ConformalDecals/ModuleConformalText.cs @@ -281,6 +281,9 @@ namespace ConformalDecals { // Render text var newText = new DecalText(text, font, style, vertical, lineSpacing, charSpacing); var output = TextRenderer.UpdateText(_currentText, newText); + + // update the _currentText state variable + // this is the ONLY place this variable should be set! otherwise the current state is lost _currentText = newText; _decalTextureProperty.Texture = output.Texture; @@ -317,4 +320,4 @@ namespace ConformalDecals { base.UpdateTweakables(); } } -} \ No newline at end of file +} diff --git a/changelog.txt b/changelog.txt deleted file mode 100644 index a5c5f46..0000000 --- a/changelog.txt +++ /dev/null @@ -1,115 +0,0 @@ -v0.2.7 ------- -- Supported KSP versions: 1.8.x to 1.11.x -- Notes: - - Attaching decal parts in flight using engineer kerbals is not supported. -- Fixes: - - Fixed certain non-ascii strings not rendering correctly under certain circumstances. - - Yet another attempted fix for the planet text glitch. - -v0.2.6 ------- -- Fixes: - - Fixed stock flags appearing stretched by forcing their aspect ratio to be correct. - - Another attempted fix for the planet text glitch. - -v0.2.5 ------- -- Fixes: - - Fixed line spacing, character spacing, and vertical settings not applying to symmetry counterparts - -v0.2.4 ------- -- Fixes: - - Fixed red text appearing on planets due to KSP bug by clearing render textures afterwards. - - Fixed fonts not saving correctly. -- Changes: - - Lowered step size for decal size and depth to 1cm. - - Changed default max size to 5m. - - Changed default text decal size to 0.2m - - Text decals now show as a circle if they contain only whitespace. - -v0.2.3 ------- -- Fixes: - - Fixed TMP subobjects being deleted, causing fallback fonts to fail in some situations. - - Started using URL-style encoding for text decals behind the scenes to prevent issues with certain characters. - - Fixed text decals having zero size when they had only whitespace or an empty string. - - Fixed decals having drag and causing issues when using FAR. - - Fixed broken saving of text decals in certain circumstances. - -v0.2.2 ------- -- Fixes: - - Fixed corrupted text rendering when a vessel loads during a scene change. - -v0.2.1 ------- -- Changes: - - Pressing enter in the text entry window now types a newline. -- Fixes: - - Renamed font assetbundle. The old extension was causing the game to try to load it twice on Windows due to legacy compatability features. - - Fixed text rendering on DirectX resulting in black boxes by using ARGB32 instead of RG16 for the render texture in DirectX. - -v0.2.0 ------- -- New Parts: - - CDL-3 Surface Base Decal: A set of conformal decals based on the symbols from the movie Moon (2009) designed by Gavin Rothery - - CDL-T Custom Text Decal: A customizable text decal with a variety of fonts -- Changes: - - New ModuleConformalText module for customizable text - - Text, font, and style can all be customized, as well as text fill and outline colors and widths - - Same projection and opacity options as other conformal decals - - New StandardText decal shader supporting the text module - - Unified all decal shaders into a single "StandardDecal" shader with variants supporting any combination of bump, specular and emissive maps, plus SDF alphas. - - Old shaders are remapped to Standard shader plus keywords automatically. - - New SDF-based antialiasing for when decals extend to their borders, e.g. on opaque flags. - - New "KEYWORD" material modifier, allowing for shader features to be enabled and disabled. - - Material modifiers can now be removed in variants by setting `remove = true` inside them. -- Fixes: - - Fixed WIDTH and HEIGHT scale modes being flipped - - Removed some debug log statements -- Dependencies: - - Updated ModuleManager to version 4.1.4 - -v0.1.4 ------- -- Supported KSP versions: 1.8.x to 1.10.x -- Fixes: - - Fixed decals rendering onto disabled B9PS part variants - - Decals will still not update whan their parent part's B9PS variant is changed, both in flight and in the editor. This is known and awaiting a change to B9PS to be fixed. - - Fixed decal bounds rendering as dark cubes when shadowed by EVE clouds. - - Fixed decals being shadowed by EVE clouds, causing the part underneath to appear overly dark. - -v0.1.3 ------- -Fixes: -- Fixed decals being able to be scaled down to 0 - -Changes: -- Made decal bounds no longer collide in flight, this is done by repurposing layer 31 (which is configurable in the ConformalDecals.cfg file) -- Decals will now be unselectable in flight by default. This can be disabled with the `selectableInFlight` value in ConformalDecals.cfg, or in the module config itself. -- Decal parts will now destroy themselves automatically when the parent part is destroyed -- Small refactor of node parsing code - - Colors can now be specified in hex (#RGB, #RGBA, #RRGGBB, or #RRGGBBAA) or using the colors specified in the XKCDColors class - -v0.1.2 ------- -Fixes: -- Disabled writing to the zbuffer in the decal bounds shader. Should fix any issues with Scatterer or EVE. - -v0.1.1 ------- -Fixes: -- Fixed flag decal not adjusting to new texture sizes immediately. -- Fixed decal bounds being visible on launch. -- Fixed decal bounds being visible in the part icon. - -v0.1.0 ------- -Initial release! - -New parts: -- CDL-F Flag Decal: Conformal flag decal, which uses either the mission flag or a flag of your choosing. -- CDL-1 Generic Decal: A set of conformal generic decals for planes and rockets -- CDL-2 Semiotic Standard Decal: A set of conformal decals based on the Semiotic Standard for All Commercial Trans-Stellar Utility Lifter and Transport Spacecraft designed by Ron Cobb for the movie Alien \ No newline at end of file