43 Commits

Author SHA1 Message Date
f545e4c5ab Fix lightingKSP for standard/standard specular 2024-08-23 22:05:05 -07:00
cb98e78a3f New LightingKSP to solve some issues with Deferred
Deferred moves the ambient calculation to the lighting pass for very good reasons, but Unity shaders still try to do it in the base pass. Easy solution is make the GI function a no-op in deferred mode.
2024-07-30 22:40:23 -07:00
946975249d More decal shader reorganization 2024-07-29 22:32:11 -07:00
ce55f07150 Add templatized text decal shader 2024-07-26 00:03:42 -07:00
7286202be9 Reorganize assets folder and tweak shaders
Moved rim shading and underwater fog to the common cginc
2024-07-25 23:29:42 -07:00
14640c1dca Templatize decal shader 2024-07-25 00:31:16 -07:00
321b2a49a4 Reorganize UI shaders 2024-07-23 22:44:41 -07:00
f1115ef188 Tweaks to clean up shader multi-compiles and formatting 2024-07-23 21:54:39 -07:00
92818edfaa Enable debugging 2024-07-21 22:20:11 -07:00
dd40e54ef3 More aggressive shader cleanup 2024-07-17 23:32:23 -07:00
c19a0c2889 Cleaned up deferred support 2024-07-17 22:48:58 -07:00
ded36f457d Add LightingKSP.cginc dropin replacement that works with Deferred 2024-07-16 19:40:34 -07:00
1be7a98835 Mostly fix VAB decal issues 2024-06-26 22:28:41 -07:00
a3a9ad9674 Improved support for deferred rendering 2024-06-26 01:04:00 -07:00
89a1f0d872 I have a very shiny tortilla 2024-06-24 23:07:44 -07:00
6db2d6b82a Release 0.2.14
### Fixed

- Fixed parts showing as all black with the Deferred Rendering mod
2024-06-24 19:12:41 -07:00
37715a46ab Fix for Deferred support
very basic, can be improved later
2024-06-24 19:12:27 -07:00
60cc0d76bb KSP 0.12.5 2024-05-17 21:02:33 -07:00
e7307f95e9 Fix title 2024-05-17 21:01:21 -07:00
88da55123b Fix syntax error in deploy script 2024-05-17 21:00:02 -07:00
eda04235c3 I hate bash 2024-05-17 20:52:00 -07:00
65031be081 Fix missing env variables and make it error if they don't exist 2024-05-17 20:42:01 -07:00
0c7f6dd628 Update KSP version in README.md 2024-05-16 19:32:11 -07:00
883c027a1a Upload bundle in release 2024-05-16 19:23:25 -07:00
d51b240c6c Use download-artifact@v4 2024-05-16 19:17:36 -07:00
91b5e584a6 Release 0.2.13
### Fixed

- Fixed flag decals sometimes not respecting image aspect ratio
2024-05-16 19:12:10 -07:00
44a5aec21e Update github actions workflow 2024-05-15 20:49:41 -07:00
8e0a26f17c Use self-hosted shabby 2024-05-15 20:35:48 -07:00
b48db63a27 Fix flag decals not respecting aspect ratio 2024-05-15 20:25:50 -07:00
c0d20f847d Update targets on an undo 2022-11-24 14:22:38 -08:00
36732ed4d4 Release 0.2.12
### Changed

- Updated bundled Shabby to 0.3.0. Does not affect CKAN users
- Made flag aspect ratio overrides configurable with `ASPECTRATIO` nodes in the config. User flags added to Squad/Flags should now be the correct aspect ratio
- All decal aspect ratios can now be overriden with the `aspectRatio` field

### Fixed

- Reverted some changes from last version that were causing issues on launch
2022-10-31 00:15:36 -07:00
d3388a4dad better null checking 2022-10-31 00:05:31 -07:00
ece9d959fd flag aspect ratio overrides are now configurable
no longer hard coded to Squad/Flags
2022-10-30 23:58:55 -07:00
dfdf280564 Fix OnDestroy not being called 2022-10-30 21:03:27 -07:00
2cca6c37bb Update bundled Shabby to 0.3.0 2022-10-30 17:26:55 -07:00
c653c9efc8 Release 0.2.11
### Fixed

- PR by LinuxGuruGamer:
	- Fixed nullref caused when an entry in `_targets` was null
	- Fixed memory leak caused by the OnDestroy() methods not being called due to them being virtual
2022-10-29 18:15:13 -07:00
374fc8b753 Format changelog 2022-10-29 18:13:46 -07:00
88b2b4841a Merge pull request #38 from linuxgurugamer/main
Nullref fix and memory leak fix
2022-10-05 22:53:10 -07:00
b2da56b1ca A few more edits 2022-09-03 18:03:01 -04:00
14bc694588 Fixed nullref caused when an entry in _targets was null
Fixed memory leak caused by the OnDestroy() methods not being called
	due to them being virtual
2022-09-03 18:01:15 -04:00
7e1b993d20 Update README.md 2022-03-19 20:34:33 -07:00
f8d692352d Remove leftover files from old deploy system 2022-03-14 21:52:43 -07:00
fa4b799788 Run on create 2022-03-13 19:12:18 -07:00
72 changed files with 1338 additions and 1030 deletions

View File

@ -1,7 +1,7 @@
name: Fast-Forward Release Branch name: Fast-Forward Release Branch
on: on:
release: release:
types: [published] types: [created]
jobs: jobs:
fast-forward: fast-forward:

View File

@ -6,15 +6,15 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- name: Setup Python - name: Setup Python
uses: actions/setup-python@v2 uses: actions/setup-python@v5
with: with:
python-version: '3.x' python-version: '3.12'
- name: Setup .NET Core SDK - name: Setup .NET Core SDK
uses: actions/setup-dotnet@v1.7.2 uses: actions/setup-dotnet@v4.0.0
with: with:
dotnet-version: '6.0.x' dotnet-version: '6.0.x'
@ -25,7 +25,7 @@ jobs:
- name: Generate Version Info - name: Generate Version Info
run: | run: |
echo "VERSION_TITLE=$(yaclog show -n)" >> $GITHUB_ENV yaclog show
python Scripts/version.py python Scripts/version.py
yaclog-ksp -n "Conformal Decals" yaclog-ksp -n "Conformal Decals"
@ -46,7 +46,7 @@ jobs:
- name: Download KSP Dependencies - name: Download KSP Dependencies
run: | run: |
wget http://pileof.rocks/KSP/Shabby_v0.2.0.zip wget https://pileof.rocks/KSP/Shabby_v0.3.0.zip
wget https://ksp.sarbian.com/jenkins/job/ModuleManager/161/artifact/ModuleManager.4.2.1.dll 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/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 wget https://github.com/KSPModdingLibs/HarmonyKSP/releases/download/2.0.4.0/HarmonyKSP_2.0.4.0_for_KSP1.8+.zip
@ -59,22 +59,22 @@ jobs:
mv HarmonyKSP/GameData/000_Harmony GameData/ mv HarmonyKSP/GameData/000_Harmony GameData/
- name: Upload Unbundled Build - name: Upload Unbundled Build
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: ConformalDecals-unbundled name: ConformalDecals-unbundled
path: | path: |
GameData/ConformalDecals GameData/ConformalDecals/
README.md README.md
CHANGELOG.md CHANGELOG.md
LICENSE-ART.md LICENSE-ART.md
LICENSE-SOURCE.md LICENSE-SOURCE.md
- name: Upload Bundled Build - name: Upload Bundled Build
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v4
with: with:
name: ConformalDecals name: ConformalDecals
path: | path: |
GameData GameData/
README.md README.md
CHANGELOG.md CHANGELOG.md
LICENSE-ART.md LICENSE-ART.md
@ -87,12 +87,12 @@ jobs:
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v4
- name: Set up Python - name: Setup Python
uses: actions/setup-python@v2 uses: actions/setup-python@v5
with: with:
python-version: '3.x' python-version: '3.12'
- name: Install Python Tools - name: Install Python Tools
run: | run: |
@ -102,13 +102,14 @@ jobs:
- name: Get version name and body - name: Get version name and body
run: | run: |
echo "VERSION_TITLE=$(yaclog show -n)" >> $GITHUB_ENV echo "VERSION_TITLE=$(yaclog show -n)" >> $GITHUB_ENV
echo "$(yaclog show -mb)" >> RELEASE.md yaclog show
- name: Download Build Artifacts - name: Download Build Artifacts
uses: actions/download-artifact@v3 uses: actions/download-artifact@v4
- name: Zip Download Packages - name: Zip Download Packages
run: | run: |
set -u
mkdir bundled mkdir bundled
mkdir unbundled mkdir unbundled
zip -r bundled/ConformalDecals-$VERSION_TITLE.zip ConformalDecals/* zip -r bundled/ConformalDecals-$VERSION_TITLE.zip ConformalDecals/*
@ -117,23 +118,25 @@ jobs:
- name: Publish to Spacedock - name: Publish to Spacedock
run: | run: |
set -u
curl -F "username=drewcassidy" -F "password=${{ secrets.SPACEDOCK_PASS }}" \ curl -F "username=drewcassidy" -F "password=${{ secrets.SPACEDOCK_PASS }}" \
-c ./cookies "https://spacedock.info/api/login" -c ./cookies "https://spacedock.info/api/login"
curl -c ./cookies -b ./cookies \ curl -c ./cookies -b ./cookies \
-F "version=$VERSION_TITLE" \ -F "version=$VERSION_TITLE" \
-F "changelog=$(yaclog show -mb)" \ -F "changelog=$(yaclog show -mb)" \
-F "game-version=1.12.3" \ -F "game-version=1.12.5" \
-F "notify-followers=yes" \ -F "notify-followers=yes" \
-F "zipball=@bundled/ConformalDecals-$VERSION_TITLE.zip" \ -F "zipball=@bundled/ConformalDecals-$VERSION_TITLE.zip" \
"https://spacedock.info/api/mod/2451/update" "https://spacedock.info/api/mod/2451/update"
- name: Publish to Github - name: Publish to Github
uses: softprops/action-gh-release@v1 run: |
with: set -u
files: | gh release create ${{ github.ref_name }} \
bundled/ConformalDecals-*.zip --notes "$(yaclog show -mb)" \
--title "Conformal Decals $VERSION_TITLE" \
bundled/ConformalDecals-*.zip \
ConformalDecals/GameData/ConformalDecals/Versioning/ConformalDecals.version ConformalDecals/GameData/ConformalDecals/Versioning/ConformalDecals.version
name: Conformal Decals ${{ env.VERSION_TITLE }}
body_path: RELEASE.md
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

12
.gitignore vendored
View File

@ -1,10 +1,8 @@
# Unity Project Directories # Unity Project Directories
Assets/* Assets/*
!Assets/Shaders/ !Assets/ConformalDecals
!Assets/Textures/ Assets/ConformalDecals/Fonts
!Assets/Scripts/ Assets/ConformalDecals/Parts
!Assets/UI/
!Assets/ConformalDecals/
KSP/ KSP/
Library/ Library/
Logs/ Logs/
@ -12,6 +10,9 @@ Packages/
ProjectSettings/ ProjectSettings/
Temp/ Temp/
# Autogenerated shaders
Assets/ConformalDecals/Shaders/Decal/*.shader
# Unity Assetbundle Manifest Files # Unity Assetbundle Manifest Files
GameData/ConformalDecals/Resources/Resources GameData/ConformalDecals/Resources/Resources
GameData/ConformalDecals/Resources/*.manifest GameData/ConformalDecals/Resources/*.manifest
@ -55,3 +56,4 @@ Source/ConformalDecals/bin
obj obj
*.swp *.swp
@thumbs @thumbs

View File

@ -1 +0,0 @@
USE_SSM_CREDENTIALS: false

View File

@ -1,34 +0,0 @@
# Example annotated build data file
mod-name: ConformalDecals
package:
include-dependencies: true # Include dependencies in the package
included-gamedata: # Include these gamedata-level folders in packages:
- ConformalDecals
included-support: # Include these root-level files in packages
- README.md
- LICENSE-ART.md
- LICENSE-SOURCE.md
- changelog.txt
dependencies: # Configure dependencies
ModuleManager:
location: url
url: https://ksp.sarbian.com/jenkins/job/ModuleManager/159/artifact/ModuleManager.4.1.4.dll
zip: false
B9PartSwitch:
location: url
url: http://pileof.rocks/KSP/B9PartSwitch-v2.18.0.zip
zip: true
Shabby:
location: url
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:
enabled: true # activate/deactivate this deployment script
mod-id: 2451 # The Spacedock mod ID for deployment
GitHub:
enabled: true # activate/deactivate this deployment script

View File

@ -0,0 +1,156 @@
Shader "ConformalDecals/Decal/{% block shader_name %}UNKNOWN{% endblock %}"
{
Properties
{
// Shader-specific properties
{% block properties %}
{% endblock %}
// Common decal properties
_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
_DecalOpacity("Opacity", Range(0,1) ) = 1
_Background("Background Color", Color) = (0.9,0.9,0.9,0.7)
[Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull", int) = 2
[Toggle] _ZWrite ("ZWrite", Float) = 1.0
[Toggle(DECAL_PREVIEW)] _Preview ("Preview", int) = 0
[Header(Effects)]
[PerRendererData]_Opacity("_Opacity", Range(0,1) ) = 1
[PerRendererData]_Color("_Color", Color) = (1,1,1,1)
[PerRendererData]_RimFalloff("_RimFalloff", Range(0.01,5) ) = 0.1
[PerRendererData]_RimColor("_RimColor", Color) = (0,0,0,0)
[PerRendererData]_UnderwaterFogFactor ("Underwater Fog Factor", Range(0,1)) = 0
}
SubShader
{
Tags
{
"Queue" = "Geometry+100" "IgnoreProjector" = "true" "DisableBatching" = "true"
}
Cull [_Cull]
Pass
{
Name "FORWARD"
Tags
{
"LightMode" = "ForwardBase"
}
ZWrite [_ZWrite]
ZTest LEqual
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag_forward
#pragma multi_compile_fwdbase
#pragma skip_variants LIGHTMAP_ON DIRLIGHTMAP_COMBINED DYNAMICLIGHTMAP_ON LIGHTMAP_SHADOW_MIXING
#pragma multi_compile_local __ DECAL_PREVIEW
{% block body %}
#error No body provided
{% endblock %}
ENDCG
}
Pass
{
Name "FORWARD"
Tags
{
"LightMode" = "ForwardAdd"
}
ZWrite Off
ZTest LEqual
Blend SrcAlpha One
Offset -1, -1
CGPROGRAM
#pragma vertex vert
#pragma fragment frag_forward
#pragma multi_compile DIRECTIONAL SPOT POINT
#pragma multi_compile __ LIGHTPROBE_SH
#pragma multi_compile_local __ DECAL_PREVIEW
{{ self.body() }}
ENDCG
}
Pass
{
Name "DEFERRED_PREPASS"
Tags
{
"LightMode" = "Deferred"
}
ZWrite Off
ZTest LEqual
Offset -1, -1
Blend 1 Zero OneMinusSrcColor, Zero OneMinusSrcAlpha
Stencil
{
Ref 1
Comp Equal
Pass Keep
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag_deferred_prepass
#pragma target 3.0
#pragma multi_compile_local __ DECAL_PREVIEW
{{ self.body() }}
{% block pragmas_deferred_prepass %}
{% endblock %}
ENDCG
}
Pass
{
Name "DEFERRED"
Tags
{
"LightMode" = "Deferred"
}
ZWrite Off
ZTest LEqual
Offset -1, -1
Blend 0 SrcAlpha OneMinusSrcAlpha, Zero One
Blend 1 One One
Blend 2 SrcAlpha OneMinusSrcAlpha, Zero One
Blend 3 SrcAlpha OneMinusSrcAlpha, Zero One
Stencil
{
Ref 1
Comp Equal
Pass Keep
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag_deferred
#pragma target 3.0
#pragma multi_compile __ LIGHTPROBE_SH
#pragma multi_compile __ UNITY_HDR_ON
#pragma multi_compile_local __ DECAL_PREVIEW
{{ self.body() }}
ENDCG
}
}
}

View File

@ -0,0 +1,422 @@
#ifndef DECALS_COMMON_INCLUDED
#define DECALS_COMMON_INCLUDED
#include "AutoLight.cginc"
#include "Lighting.cginc"
#include "../LightingKSP.cginc"
#define CLIP_MARGIN 0.05
#define EDGE_MARGIN 0.01
// UNIFORM VARIABLES
// Projection matrix, normal, and tangent vectors
float4x4 _ProjectionMatrix;
float3 _DecalNormal;
float3 _DecalTangent;
// Common Shading Paramaters
float _Cutoff;
float _DecalOpacity;
float4 _Background;
sampler2D _Decal;
float4 _Decal_ST;
// Variant Shading Parameters
#ifdef DECAL_BASE_NORMAL
sampler2D _BumpMap;
float4 _BumpMap_ST;
float _EdgeWearStrength;
float _EdgeWearOffset;
#endif //DECAL_BASE_NORMAL
#ifdef DECAL_BUMPMAP
sampler2D _BumpMap;
float4 _BumpMap_ST;
#endif //DECAL_BUMPMAP
#ifdef DECAL_SPECMAP
sampler2D _SpecMap;
float4 _SpecMap_ST;
// specular color is declared in a unity CGINC for some reason??
#endif //DECAL_SPECMAP
fixed _Shininess;
#ifdef DECAL_EMISSIVE
sampler2D _Emissive;
float4 _Emissive_ST;
fixed4 _Emissive_Color;
#endif //DECAL_EMISSIVE
// KSP EFFECTS
// opacity and color
float _Opacity;
float _RimFalloff;
float4 _RimColor;
// SURFACE INPUT STRUCT
struct DecalSurfaceInput
{
float3 uv;
float2 uv_decal;
#ifdef DECAL_BUMPMAP
float2 uv_bumpmap;
#endif //DECAL_BUMPMAP
#ifdef DECAL_SPECMAP
float2 uv_specmap;
#endif //DECAL_SPECMAP
#ifdef DECAL_EMISSIVE
float2 uv_emissive;
#endif //DECAL_EMISSIVE
#ifdef DECAL_BASE_NORMAL
float3 normal;
#endif //DECAL_BASE_NORMAL
float3 vertex_normal;
float3 viewDir;
float3 worldPosition;
};
struct appdata_decal
{
float4 vertex : POSITION;
float3 normal : NORMAL;
#if defined(DECAL_BASE_NORMAL) || defined(DECAL_PREVIEW)
float4 texcoord : TEXCOORD0;
float4 tangent : TANGENT;
#endif
};
struct v2f
{
UNITY_POSITION(pos);
float3 normal : NORMAL;
float4 uv_decal : TEXCOORD0;
#ifdef DECAL_BASE_NORMAL
float2 uv_base : TEXCOORD1;
#endif //DECAL_BASE_NORMAL
float4 tSpace0 : TEXCOORD2;
float4 tSpace1 : TEXCOORD3;
float4 tSpace2 : TEXCOORD4;
#ifdef UNITY_PASS_FORWARDBASE
fixed3 vlight : TEXCOORD5;
UNITY_SHADOW_COORDS(6)
#endif //UNITY_PASS_FORWARDBASE
#ifdef UNITY_PASS_FORWARDADD
UNITY_LIGHTING_COORDS(5,6)
#endif //UNITY_PASS_FORWARDADD
#if UNITY_SHOULD_SAMPLE_SH
half3 sh : TEXCOORD7; // SH
#endif
};
inline void decalClipAlpha(float alpha) {
#ifndef DECAL_PREVIEW
clip(alpha - 0.001);
#endif
}
inline float CalcMipLevel(float2 texture_coord) {
float2 dx = ddx(texture_coord);
float2 dy = ddy(texture_coord);
float delta_max_sqr = max(dot(dx, dx), dot(dy, dy));
return 0.5 * log2(delta_max_sqr);
}
// Decal bounds distance function
// takes in a world position, world normal, and projector normal and outputs a unitless signed distance from the
inline float BoundsDist(float3 p, float3 normal, float3 projNormal) {
float3 q = abs(p - 0.5) - 0.5; // 1x1 square/cube centered at (0.5,0.5)
//float dist = length(max(q,0)) + min(max(q.x,max(q.y,q.z)),0.0); // true SDF
#ifdef DECAL_PREVIEW
return 10 * max(q.x, q.y); // 2D pseudo SDF
#else
float dist = max(max(q.x, q.y), q.z); // pseudo SDF
float ndist = EDGE_MARGIN - dot(normal, projNormal); // SDF to normal
return 10 * max(dist, ndist); // return intersection
#endif //DECAL_PREVIEW
}
// declare surf function,
// this must be defined in any shader using this cginc
void surf (DecalSurfaceInput IN, inout SurfaceOutput o);
v2f vert(appdata_decal v)
{
v2f o;
UNITY_INITIALIZE_OUTPUT(v2f,o);
o.pos = UnityObjectToClipPos(v.vertex);
o.normal = v.normal;
#ifdef DECAL_PREVIEW
o.uv_decal = v.texcoord;
#else
o.uv_decal = mul (_ProjectionMatrix, v.vertex);
#endif //DECAL_PREVIEW
#ifdef DECAL_BASE_NORMAL
o.uv_base = TRANSFORM_TEX(v.texcoord, _BumpMap);
#endif //DECAL_BASE_NORMAL
float3 worldPosition = mul(unity_ObjectToWorld, v.vertex).xyz;
float3 worldNormal = UnityObjectToWorldNormal(v.normal);
#if defined(DECAL_BASE_NORMAL) || defined(DECAL_PREVIEW)
// use tangent of base geometry
fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);
fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w;
fixed3 worldBinormal = cross(worldNormal, worldTangent) * tangentSign;
#else
// use tangent of projector
fixed3 decalTangent = UnityObjectToWorldDir(_DecalTangent);
fixed3 worldBinormal = cross(decalTangent, worldNormal);
fixed3 worldTangent = cross(worldNormal, worldBinormal);
#endif //defined(DECAL_BASE_NORMAL) || defined(DECAL_PREVIEW)
o.tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPosition.x);
o.tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPosition.y);
o.tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPosition.z);
// forward base pass specific lighting code
#ifdef UNITY_PASS_FORWARDBASE
// SH/ambient light
#if UNITY_SHOULD_SAMPLE_SH
float3 shlight = ShadeSH9 (float4(worldNormal,1.0));
o.vlight = shlight;
#else
o.vlight = 0.0;
#endif // UNITY_SHOULD_SAMPLE_SH
// vertex light
#ifdef VERTEXLIGHT_ON
o.vlight += Shade4PointLights (
unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,
unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb,
unity_4LightAtten0, worldPosition, worldNormal );
#endif // VERTEXLIGHT_ON
#endif // UNITY_PASS_FORWARDBASE
// pass shadow and, possibly, light cookie coordinates to pixel shader
UNITY_TRANSFER_LIGHTING(o, 0.0);
return o;
}
SurfaceOutput frag_common(v2f IN, out float3 worldPos, out float3 worldViewDir, out float3 viewDir) {
SurfaceOutput o;
// setup world-space TBN vectors
UNITY_EXTRACT_TBN(IN);
worldPos = float3(IN.tSpace0.w, IN.tSpace1.w, IN.tSpace2.w);
worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
viewDir = _unity_tbn_0 * worldViewDir.x + _unity_tbn_1 * worldViewDir.y + _unity_tbn_2 * worldViewDir.z;
#ifdef DECAL_PREVIEW
fixed4 uv_projected = IN.uv_decal;
#else
// perform decal projection
fixed4 uv_projected = UNITY_PROJ_COORD(IN.uv_decal);
clip(uv_projected.xyz + CLIP_MARGIN);
clip(CLIP_MARGIN + (1-uv_projected.xyz));
#endif //DECAL_PREVIEW
// declare data
DecalSurfaceInput i;
// initialize surface input
UNITY_INITIALIZE_OUTPUT(DecalSurfaceInput, i)
i.uv_decal = TRANSFORM_TEX(uv_projected, _Decal);
i.uv = uv_projected;
#ifdef DECAL_BUMPMAP
i.uv_bumpmap = TRANSFORM_TEX(uv_projected, _BumpMap);
#endif //DECAL_BUMPMAP
#ifdef DECAL_SPECMAP
i.uv_specmap = TRANSFORM_TEX(uv_projected, _SpecMap);
#endif //DECAL_SPECMAP
#ifdef DECAL_EMISSIVE
i.uv_emissive = TRANSFORM_TEX(uv_projected, _Emissive);
#endif //DECAL_EMISSIVE
#ifdef DECAL_BASE_NORMAL
#ifdef DECAL_PREVIEW
i.normal = fixed3(0,0,1);
#else
i.normal = UnpackNormalDXT5nm(tex2D(_BumpMap, IN.uv_base));
#endif //DECAL_PREVIEW
#endif //DECAL_BASE_NORMAL
i.vertex_normal = IN.normal;
i.viewDir = viewDir;
i.worldPosition = worldPos;
// initialize surface output
o.Albedo = 0.0;
o.Emission = 0.0;
o.Specular = 0.4;
o.Alpha = _DecalOpacity;
o.Gloss = 0.0;
o.Normal = fixed3(0,0,1);
// call surface function
surf(i, o);
// apply KSP fog. In the deferred pass this is a no-op
o.Albedo = UnderwaterFog(i.worldPosition, o.Albedo).rgb;
// apply KSP rim lighting
half rim = 1.0 - saturate(dot(normalize(i.viewDir), o.Normal));
o.Emission += o.Emission = (_RimColor.rgb * pow(rim, _RimFalloff)) * _RimColor.a;
// compute world normal
float3 worldN;
worldN.x = dot(_unity_tbn_0, o.Normal);
worldN.y = dot(_unity_tbn_1, o.Normal);
worldN.z = dot(_unity_tbn_2, o.Normal);
worldN = normalize(worldN);
o.Normal = worldN;
return o;
}
fixed4 frag_forward(v2f IN) : SV_Target
{
fixed4 c = 0;
float3 worldPos;
float3 worldViewDir;
float3 viewDir;
SurfaceOutput o = frag_common(IN, worldPos, worldViewDir, viewDir);
// compute lighting & shadowing factor
UNITY_LIGHT_ATTENUATION(atten, IN, worldPos)
#ifndef USING_DIRECTIONAL_LIGHT
fixed3 lightDir = normalize(UnityWorldSpaceLightDir(worldPos));
#else
fixed3 lightDir = _WorldSpaceLightPos0.xyz;
#endif
// Setup lighting environment
UnityGI gi;
UNITY_INITIALIZE_OUTPUT(UnityGI, gi);
gi.indirect.diffuse = 0;
gi.indirect.specular = 0;
gi.light.color = _LightColor0.rgb;
gi.light.dir = lightDir;
#ifdef UNITY_PASS_FORWARDBASE
// Call GI (lightmaps/SH/reflections) lighting function
UnityGIInput giInput;
UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);
giInput.light = gi.light;
giInput.worldPos = worldPos;
giInput.worldViewDir = worldViewDir;
giInput.atten = atten;
#if UNITY_SHOULD_SAMPLE_SH && !UNITY_SAMPLE_FULL_SH_PER_PIXEL
giInput.ambient = IN.sh;
#else
giInput.ambient.rgb = 0.0;
#endif
LightingBlinnPhongKSP_GI(o, giInput, gi);
#endif
#ifdef UNITY_PASS_FORWARDADD
gi.light.color *= atten;
#endif
//call modified KSP lighting function
c += LightingBlinnPhongKSP(o, viewDir, gi);
c.rgb += o.Emission;
return c;
}
void frag_deferred (v2f IN,
out half4 outGBuffer0 : SV_Target0,
out half4 outGBuffer1 : SV_Target1,
#if defined(DECAL_BUMPMAP) || defined(DECAL_PREVIEW)
out half4 outGBuffer2 : SV_Target2,
#endif
out half4 outEmission : SV_Target3)
{
#if !(defined(DECAL_BUMPMAP) || defined(DECAL_PREVIEW))
half4 outGBuffer2 = 0; // define dummy normal buffer when we're not writing to it
#endif
float3 worldPos;
float3 worldViewDir;
float3 viewDir;
SurfaceOutput o = frag_common(IN, worldPos, worldViewDir, viewDir);
// Setup lighting environment
UnityGI gi;
UNITY_INITIALIZE_OUTPUT(UnityGI, gi);
gi.indirect.diffuse = 0;
gi.indirect.specular = 0;
gi.light.color = 0;
gi.light.dir = half3(0,1,0);
UnityGIInput giInput;
UNITY_INITIALIZE_OUTPUT(UnityGIInput, giInput);
giInput.light = gi.light;
giInput.worldPos = worldPos;
giInput.worldViewDir = worldViewDir;
giInput.atten = 1;
giInput.lightmapUV = 0.0;
#if UNITY_SHOULD_SAMPLE_SH && !UNITY_SAMPLE_FULL_SH_PER_PIXEL
giInput.ambient = 0.0 * IN.sh;
#else
giInput.ambient.rgb = 0.0;
#endif
giInput.probeHDR[0] = unity_SpecCube0_HDR;
giInput.probeHDR[1] = unity_SpecCube1_HDR;
LightingBlinnPhongKSP_GI(o, giInput, gi);
outEmission = LightingBlinnPhongKSP_Deferred(o, worldViewDir, gi, outGBuffer0, outGBuffer1, outGBuffer2);
// outGBuffer0 = outEmission;
#ifndef UNITY_HDR_ON
outEmission.rgb = exp2(-outEmission.rgb);
#endif
outGBuffer0.a = o.Alpha;
outGBuffer1 *= o.Alpha;
outGBuffer2.a = o.Alpha;
outEmission.a = o.Alpha;
}
void frag_deferred_prepass(v2f IN, out half4 outGBuffer1: SV_Target1) {
float3 worldPos;
float3 worldViewDir;
float3 viewDir;
SurfaceOutput o = frag_common(IN, worldPos, worldViewDir, viewDir);
outGBuffer1 = o.Alpha;
}
#endif

View File

@ -1,28 +1,27 @@
#include "DecalsCommon.cginc"
#include "../SDF.cginc"
void surf(DecalSurfaceInput IN, inout SurfaceOutput o) { void surf(DecalSurfaceInput IN, inout SurfaceOutput o) {
float4 color = tex2D(_Decal, IN.uv_decal); float4 color = tex2D(_Decal, IN.uv_decal);
o.Albedo = UnderwaterFog(IN.worldPosition, color).rgb; o.Albedo = color.rgb;
o.Alpha = _DecalOpacity; o.Specular = 0.4;
o.Gloss = _Shininess;
#ifdef DECAL_BASE_NORMAL #ifdef DECAL_BASE_NORMAL
float3 normal = IN.normal; float3 normal = IN.normal;
float wearFactor = 1 - normal.z; float wearFactor = 1 - normal.z;
float wearFactorAlpha = saturate(_EdgeWearStrength * wearFactor);
o.Alpha *= saturate(1 + _EdgeWearOffset - saturate(_EdgeWearStrength * wearFactor)); o.Alpha *= saturate(1 + _EdgeWearOffset - saturate(_EdgeWearStrength * wearFactor));
#endif #endif
#ifdef DECAL_BUMPMAP #ifdef DECAL_BUMPMAP
o.Normal = tex2D(_BumpMap, IN.uv_bumpmap); o.Normal = UnpackNormalDXT5nm(tex2D(_BumpMap, IN.uv_bumpmap));
#endif #endif
#ifdef DECAL_SPECMAP #ifdef DECAL_SPECMAP
float4 specular = tex2D(_SpecMap, IN.uv_specmap); float4 specular = tex2D(_SpecMap, IN.uv_specmap);
o.Gloss = specular.r; o.Specular = specular;
o.Specular = _Shininess;
#endif #endif
half rim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal));
o.Emission = (_RimColor.rgb * pow(rim, _RimFalloff)) * _RimColor.a;
#ifdef DECAL_EMISSIVE #ifdef DECAL_EMISSIVE
o.Emission += tex2D(_Emissive, IN.uv_emissive).rgb * _Emissive_Color.rgb * _Emissive_Color.a; o.Emission += tex2D(_Emissive, IN.uv_emissive).rgb * _Emissive_Color.rgb * _Emissive_Color.a;
#endif #endif
@ -34,5 +33,5 @@ void surf(DecalSurfaceInput IN, inout SurfaceOutput o) {
#else #else
o.Alpha *= SDFAA(dist); o.Alpha *= SDFAA(dist);
o.Alpha *= color.a; o.Alpha *= color.a;
#endif #endif
} }

View File

@ -0,0 +1,40 @@
{% extends "DecalBase.shader.template" %}
{% block shader_name %}Standard{% endblock %}
{% block properties %}
[Header(Decal)]
_Decal("Decal Texture", 2D) = "gray" {}
[Toggle(DECAL_SDF_ALPHA)] _Decal_SDF_Alpha ("SDF in Alpha", int) = 0
[Header(Normal)]
[Toggle(DECAL_BASE_NORMAL)] _BaseNormal ("Use Base Normal", int) = 0
[Toggle(DECAL_BUMPMAP)] _Decal_BumpMap ("Has BumpMap", int) = 0
_BumpMap("Bump Map", 2D) = "bump" {}
_EdgeWearStrength("Edge Wear Strength", Range(0,500)) = 100
_EdgeWearOffset("Edge Wear Offset", Range(0,1)) = 0.1
[Header(Specularity)]
[Toggle(DECAL_SPECMAP)] _Decal_SpecMap ("Has SpecMap", int) = 0
_SpecMap ("Specular Map", 2D) = "black" {}
_SpecColor ("_SpecColor", Color) = (0.25, 0.25, 0.25, 1)
_Shininess ("Shininess", Range (0.03, 10)) = 0.3
[Header(Emissive)]
[Toggle(DECAL_EMISSIVE)] _Decal_Emissive ("Has Emissive", int) = 0
_Emissive("_Emissive", 2D) = "black" {}
_EmissiveColor("_EmissiveColor", Color) = (0,0,0,1)
{% endblock %}
{% block body %}
#pragma multi_compile_local __ DECAL_BASE_NORMAL DECAL_BUMPMAP
#pragma multi_compile_local __ DECAL_SPECMAP
#pragma multi_compile_local __ DECAL_EMISSIVE
#pragma multi_compile_local __ DECAL_SDF_ALPHA
#include "StandardDecal.cginc"
{% endblock %}
{% block pragmas_deferred_prepass %}
#pragma skip_variants DECAL_SPECMAP DECAL_EMISSIVE DECAL_BUMPMAP
{% endblock %}

View File

@ -1,3 +1,6 @@
#include "DecalsCommon.cginc"
#include "../SDF.cginc"
float4 _DecalColor; float4 _DecalColor;
float4 _OutlineColor; float4 _OutlineColor;
@ -5,8 +8,11 @@ float _OutlineWidth;
void surf(DecalSurfaceInput IN, inout SurfaceOutput o) { void surf(DecalSurfaceInput IN, inout SurfaceOutput o) {
float4 color = _DecalColor; float4 color = _DecalColor;
o.Specular = 0.4;
o.Gloss = _Shininess;
float dist = _Cutoff - tex2D(_Decal, IN.uv_decal).r; // text distance float dist = _Cutoff - tex2D(_Decal, IN.uv_decal).r; // text distance
#ifdef DECAL_OUTLINE #ifdef DECAL_OUTLINE
// Outline // Outline
float outlineOffset = _OutlineWidth * 0.25; float outlineOffset = _OutlineWidth * 0.25;
@ -28,8 +34,8 @@ void surf(DecalSurfaceInput IN, inout SurfaceOutput o) {
dist = max(dist, BoundsDist(IN.uv, IN.vertex_normal, _DecalNormal)); dist = max(dist, BoundsDist(IN.uv, IN.vertex_normal, _DecalNormal));
float ddist = SDFdDist(dist); // distance gradient magnitude float ddist = SDFdDist(dist); // distance gradient magnitude
o.Alpha = _DecalOpacity * SDFAA(dist, ddist); o.Albedo = color.rgb;
o.Albedo = UnderwaterFog(IN.worldPosition, color).rgb; o.Alpha *= SDFAA(dist, ddist);
#ifdef DECAL_BASE_NORMAL #ifdef DECAL_BASE_NORMAL
float3 normal = IN.normal; float3 normal = IN.normal;
@ -40,10 +46,6 @@ void surf(DecalSurfaceInput IN, inout SurfaceOutput o) {
#ifdef DECAL_SPECMAP #ifdef DECAL_SPECMAP
float4 specular = tex2D(_SpecMap, IN.uv_specmap); float4 specular = tex2D(_SpecMap, IN.uv_specmap);
o.Gloss = specular.r; o.Specular = specular;
o.Specular = _Shininess;
#endif #endif
half rim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal));
o.Emission = (_RimColor.rgb * pow(rim, _RimFalloff)) * _RimColor.a;
} }

View File

@ -0,0 +1,41 @@
{% extends "DecalBase.shader.template" %}
{% block shader_name %}Text{% endblock %}
{% block properties %}
[Header(Decal)]
[Toggle(DECAL_FILL)] _Fill ("Fill", int) = 0
_Decal("Decal Texture", 2D) = "gray" {}
_DecalColor("Decal Color", Color) = (1,1,1,1)
_Weight("Text Weight", Range(0,1)) = 0
[Header(Outline)]
[Toggle(DECAL_OUTLINE)] _Outline ("Outline", int) = 0
_OutlineColor("Outline Color", Color) = (0,0,0,1)
_OutlineWidth("Outline Width", Range(0,1)) = 0.1
[Header(Normal)]
[Toggle(DECAL_BASE_NORMAL)] _BaseNormal ("Use Base Normal", int) = 0
_BumpMap("Bump Map", 2D) = "bump" {}
_EdgeWearStrength("Edge Wear Strength", Range(0,500)) = 100
_EdgeWearOffset("Edge Wear Offset", Range(0,1)) = 0.1
[Header(Specularity)]
[Toggle(DECAL_SPECMAP)] _Decal_SpecMap ("Has SpecMap", int) = 0
_SpecMap ("Specular Map)", 2D) = "black" {}
_SpecColor ("_SpecColor", Color) = (0.25, 0.25, 0.25, 1)
_Shininess ("Shininess", Range (0.03, 10)) = 0.3
{% endblock %}
{% block body %}
#pragma multi_compile_local __ DECAL_BASE_NORMAL
#pragma multi_compile_local __ DECAL_SPECMAP
#pragma multi_compile_local __ DECAL_OUTLINE
#pragma multi_compile_local __ DECAL_FILL
#include "TextDecal.cginc"
{% endblock %}
{% block pragmas_deferred_prepass %}
#pragma skip_variants DECAL_SPECMAP
{% endblock %}

View File

@ -29,7 +29,7 @@ Shader "ConformalDecals/Decal Back"
CGPROGRAM CGPROGRAM
#include "LightingKSP.cginc" #include "LightingKSP.cginc"
#pragma surface surf BlinnPhongSmooth vertex:vert #pragma surface surf BlinnPhongKSP vertex:vert
#pragma target 3.0 #pragma target 3.0
sampler2D _MainTex; sampler2D _MainTex;
@ -63,12 +63,12 @@ Shader "ConformalDecals/Decal Back"
// 45° rotation // 45° rotation
uv_MainTex.x = IN.uv_MainTex.x - IN.uv_MainTex.y; uv_MainTex.x = IN.uv_MainTex.x - IN.uv_MainTex.y;
uv_MainTex.y = IN.uv_MainTex.x + IN.uv_MainTex.y; uv_MainTex.y = IN.uv_MainTex.x + IN.uv_MainTex.y;
// stagger every other row // stagger every other row
uv_MainTex.y *= 2;
int row = floor(uv_MainTex.y); int row = floor(uv_MainTex.y);
uv_MainTex.x += row * _RowOffset; uv_MainTex.x += row * _RowOffset;
uv_MainTex.y *= 2;
float4 color = _Color * tex2D(_MainTex,(uv_MainTex)); float4 color = _Color * tex2D(_MainTex,(uv_MainTex));
float3 normal = UnpackNormal(tex2D(_BumpMap, uv_BumpMap)); float3 normal = UnpackNormal(tex2D(_BumpMap, uv_BumpMap));

View File

@ -0,0 +1,161 @@
// WHAT IS THIS FILE?
// this file provides a replacement for the LightingKSP.cginc file that ships with part tools for writing custom shaders.
// This version enables support for the Deferred mod
//
// HOW DO I USE IT?
// Step 1)
// replace LightingKSP.cginc in your shader folder with this file, if present. If you aren't using LightingKSP.cginc
// in your shader, add the following below `CGPROGRAM`:
// `#include "../LightingKSP.cginc"`
//
// Step 2)
// add the following above `CGPROGRAM`:
// ```
// Stencil
// {
// Ref 1
// Comp Always
// Pass Replace
// }
// ```
//
// Step 3)
// there should be a line in your shader that looks like this:
// `#pragma surface surf BlinnPhongSmooth keepalpha`
// Remove the `keepalpha` if it's there. the part after `surf` is the name of the lighting function your shader uses now.
// If the lighting function is `BlinnPhong` or `BlinnPhongSmooth`, change it to `BlinnPhongKSP`
// If the lighting function is `Standard`, change it to `StandardKSP`
// If the lighting function is `StandardSpecular`, change it to `StandardSpecularKSP`
#ifndef LIGHTING_KSP_INCLUDED
#define LIGHTING_KSP_INCLUDED
#include "UnityPBSLighting.cginc"
#define blinnPhongShininessPower 0.215
// An exact conversion from blinn-phong to PBR is impossible, but the look can be approximated perceptually
// and by observing how blinn-phong looks and feels at various settings, although it can never be perfect
// 1) The specularColor can be used as is in the PBR specular flow, just needs to be divided by PI so it sums up to 1 over the hemisphere
// 2) Blinn-phong shininess doesn't stop feeling shiny unless at very low values, like below 0.04
// while the PBR smoothness feels more linear -> map shininess to smoothness accordingly using a function
// that increases very quickly at first then slows down, I went with something like x^(1/4) or x^(1/6) then made the power configurable
// I tried various mappings from the literature but nothing really worked as well as this
// 3) Finally I noticed that some parts still looked very shiny like the AV-R8 winglet while in stock they looked rough thanks a low
// specularColor but high shininess and specularMap, so I multiplied the smoothness by the sqrt of the specularColor and that caps
// the smoothness when specularColor is low
void GetStandardSpecularPropertiesFromLegacy(float legacyShininess, float specularMap, out float3 specular,
out float smoothness)
{
float3 legacySpecularColor = saturate(_SpecColor);
smoothness = pow(legacyShininess, blinnPhongShininessPower) * specularMap;
smoothness *= sqrt(length(legacySpecularColor));
specular = legacySpecularColor * UNITY_INV_PI;
}
float4 _Color;
// LEGACY BLINN-PHONG LIGHTING FUNCTION FOR KSP WITH PBR CONVERSION FOR DEFERRED
inline float4 LightingBlinnPhongKSP(SurfaceOutput s, half3 viewDir, UnityGI gi)
{
return LightingBlinnPhong(s,viewDir, gi);
}
inline float4 LightingBlinnPhongKSP_Deferred(SurfaceOutput s, float3 worldViewDir, UnityGI gi,
out float4 outDiffuseOcclusion, out float4 outSpecSmoothness,
out float4 outNormal)
{
SurfaceOutputStandardSpecular ss;
ss.Albedo = s.Albedo;
ss.Normal = s.Normal;
ss.Emission = s.Emission;
ss.Occlusion = 1;
ss.Alpha = saturate(s.Alpha);
GetStandardSpecularPropertiesFromLegacy(s.Specular, s.Gloss, ss.Specular, ss.Smoothness);
return LightingStandardSpecular_Deferred(ss, worldViewDir, gi, outDiffuseOcclusion, outSpecSmoothness, outNormal);
}
inline void LightingBlinnPhongKSP_GI(inout SurfaceOutput s, UnityGIInput gi_input, inout UnityGI gi)
{
#ifndef UNITY_PASS_DEFERRED
gi = UnityGlobalIllumination(gi_input, 1.0, s.Normal);
#endif
}
// STANDARD UNITY LIGHTING FUNCTION FOR KSP
inline float4 LightingStandardKSP(SurfaceOutputStandard s, float3 worldViewDir, UnityGI gi)
{
return LightingStandard(s, worldViewDir, gi); // no change
}
inline float4 LightingStandardKSP_Deferred(SurfaceOutputStandard s, float3 worldViewDir, UnityGI gi,
out float4 outDiffuseOcclusion,
out float4 outSpecSmoothness, out float4 outNormal)
{
return LightingStandard_Deferred(s, worldViewDir, gi, outDiffuseOcclusion, outSpecSmoothness, outNormal);
}
inline void LightingStandardKSP_GI(inout SurfaceOutputStandard s, UnityGIInput gi_input, inout UnityGI gi)
{
#ifndef UNITY_PASS_DEFERRED
LightingStandard_GI(s, gi_input, gi);
#endif
}
// STANDARD SPECULAR UNITY LIGHTING FUNCTION FOR KSP
inline float4 LightingStandardSpecularKSP(SurfaceOutputStandardSpecular s, float3 worldViewDir, UnityGI gi)
{
return LightingStandardSpecular(s, worldViewDir, gi); // no change
}
inline float4 LightingStandardSpecularKSP_Deferred(SurfaceOutputStandardSpecular s, float3 worldViewDir, UnityGI gi,
out float4 outDiffuseOcclusion,
out float4 outSpecSmoothness, out float4 outNormal)
{
return LightingStandardSpecular_Deferred(s, worldViewDir, gi, outDiffuseOcclusion, outSpecSmoothness, outNormal);
}
inline void LightingStandardSpecularKSP_GI(inout SurfaceOutputStandardSpecular s, UnityGIInput gi_input,
inout UnityGI gi)
{
#ifndef UNITY_PASS_DEFERRED
LightingStandardSpecular_GI(s, gi_input, gi);
#endif
}
float4 _LocalCameraPos;
float4 _LocalCameraDir;
float4 _UnderwaterFogColor;
float _UnderwaterMinAlphaFogDistance;
float _UnderwaterMaxAlbedoFog;
float _UnderwaterMaxAlphaFog;
float _UnderwaterAlbedoDistanceScalar;
float _UnderwaterAlphaDistanceScalar;
float _UnderwaterFogFactor;
float4 UnderwaterFog(float3 worldPos, float3 color)
{
// skip fog in deferred mode
#ifdef UNITY_PASS_DEFERRED
return float4(color, 1);
#endif
float3 toPixel = worldPos - _LocalCameraPos.xyz;
float toPixelLength = length(toPixel); ///< Comment out the math--looks better without it.
float underwaterDetection = _UnderwaterFogFactor * _LocalCameraDir.w; ///< sign(1 - sign(_LocalCameraPos.w));
float albedoLerpValue = underwaterDetection * (_UnderwaterMaxAlbedoFog * saturate(
toPixelLength * _UnderwaterAlbedoDistanceScalar));
float alphaFactor = 1 - underwaterDetection * (_UnderwaterMaxAlphaFog * saturate(
(toPixelLength - _UnderwaterMinAlphaFogDistance) * _UnderwaterAlphaDistanceScalar));
return float4(lerp(color, _UnderwaterFogColor.rgb, albedoLerpValue), alphaFactor);
}
#endif

View File

@ -4,11 +4,11 @@ Shader "ConformalDecals/UI/Color Slider"
{ {
_Color("Color", Color) = (0,0,0,0) _Color("Color", Color) = (0,0,0,0)
_Radius("Radius", Float) = 4 _Radius("Radius", Float) = 4
_OutlineGradient("Outline Gradient Step", Range (0, 1)) = 0.6 _OutlineGradient("Outline Gradient Step", Range (0, 1)) = 0.6
_OutlineOpacity("Outline Opacity", Range (0, 0.5)) = 0.1 _OutlineOpacity("Outline Opacity", Range (0, 0.5)) = 0.1
_OutlineWidth("Outline Width", Float) = 3 _OutlineWidth("Outline Width", Float) = 3
_StencilComp ("Stencil Comparison", Float) = 8 _StencilComp ("Stencil Comparison", Float) = 8
_Stencil ("Stencil ID", Float) = 0 _Stencil ("Stencil ID", Float) = 0
_StencilOp ("Stencil Operation", Float) = 0 _StencilOp ("Stencil Operation", Float) = 0
@ -18,13 +18,11 @@ Shader "ConformalDecals/UI/Color Slider"
_ColorMask ("Color Mask", Float) = 15 _ColorMask ("Color Mask", Float) = 15
[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
[Toggle(HUE)] _Hue ("Hue", int) = 0 [Toggle(HUE)] _Hue ("Hue", int) = 0
[Toggle(RED)] _Red ("Red", int) = 0 [Toggle(RED)] _Red ("Red", int) = 0
[Toggle(GREEN)] _Green ("Green", int) = 0 [Toggle(GREEN)] _Green ("Green", int) = 0
[Toggle(BLUE)] _Blue ("Blue", int) = 0 [Toggle(BLUE)] _Blue ("Blue", int) = 0
} }
SubShader SubShader
{ {
@ -44,14 +42,14 @@ Shader "ConformalDecals/UI/Color Slider"
ReadMask [_StencilReadMask] ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask] WriteMask [_StencilWriteMask]
} }
Cull Off Cull Off
Lighting Off Lighting Off
ZWrite Off ZWrite Off
ZTest [unity_GUIZTestMode] ZTest [unity_GUIZTestMode]
Blend SrcAlpha OneMinusSrcAlpha Blend SrcAlpha OneMinusSrcAlpha
ColorMask [_ColorMask] ColorMask [_ColorMask]
Pass Pass
{ {
CGPROGRAM CGPROGRAM
@ -63,7 +61,7 @@ Shader "ConformalDecals/UI/Color Slider"
#include "UnityCG.cginc" #include "UnityCG.cginc"
#include "UnityUI.cginc" #include "UnityUI.cginc"
#include "HSL.cginc" #include "HSL.cginc"
#include "SDF.cginc" #include "../SDF.cginc"
#pragma multi_compile_local _ UNITY_UI_CLIP_RECT #pragma multi_compile_local _ UNITY_UI_CLIP_RECT
#pragma multi_compile_local _ UNITY_UI_ALPHACLIP #pragma multi_compile_local _ UNITY_UI_ALPHACLIP

View File

@ -8,7 +8,7 @@ Shader "ConformalDecals/UI/HSV Square"
_OutlineGradient("Outline Gradient Step", Range (0, 1)) = 0.6 _OutlineGradient("Outline Gradient Step", Range (0, 1)) = 0.6
_OutlineOpacity("Outline Opacity", Range (0, 0.5)) = 0.1 _OutlineOpacity("Outline Opacity", Range (0, 0.5)) = 0.1
_OutlineWidth("Outline Width", Float) = 3 _OutlineWidth("Outline Width", Float) = 3
_StencilComp ("Stencil Comparison", Float) = 8 _StencilComp ("Stencil Comparison", Float) = 8
_Stencil ("Stencil ID", Float) = 0 _Stencil ("Stencil ID", Float) = 0
_StencilOp ("Stencil Operation", Float) = 0 _StencilOp ("Stencil Operation", Float) = 0
@ -37,14 +37,14 @@ Shader "ConformalDecals/UI/HSV Square"
ReadMask [_StencilReadMask] ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask] WriteMask [_StencilWriteMask]
} }
Cull Off Cull Off
Lighting Off Lighting Off
ZWrite Off ZWrite Off
ZTest [unity_GUIZTestMode] ZTest [unity_GUIZTestMode]
Blend SrcAlpha OneMinusSrcAlpha Blend SrcAlpha OneMinusSrcAlpha
ColorMask [_ColorMask] ColorMask [_ColorMask]
Pass Pass
{ {
CGPROGRAM CGPROGRAM
@ -56,7 +56,7 @@ Shader "ConformalDecals/UI/HSV Square"
#include "UnityCG.cginc" #include "UnityCG.cginc"
#include "UnityUI.cginc" #include "UnityUI.cginc"
#include "HSL.cginc" #include "HSL.cginc"
#include "SDF.cginc" #include "../SDF.cginc"
#pragma multi_compile_local _ UNITY_UI_CLIP_RECT #pragma multi_compile_local _ UNITY_UI_CLIP_RECT
#pragma multi_compile_local _ UNITY_UI_ALPHACLIP #pragma multi_compile_local _ UNITY_UI_ALPHACLIP

View File

@ -4,11 +4,11 @@ Shader "ConformalDecals/UI/Color Swatch"
{ {
_Color("Color", Color) = (0,0,0,0) _Color("Color", Color) = (0,0,0,0)
_Radius("Radius", Float) = 4 _Radius("Radius", Float) = 4
_OutlineGradient("Outline Gradient Step", Range (0, 1)) = 0.6 _OutlineGradient("Outline Gradient Step", Range (0, 1)) = 0.6
_OutlineOpacity("Outline Opacity", Range (0, 0.5)) = 0.1 _OutlineOpacity("Outline Opacity", Range (0, 0.5)) = 0.1
_OutlineWidth("Outline Width", Float) = 3 _OutlineWidth("Outline Width", Float) = 3
_StencilComp ("Stencil Comparison", Float) = 8 _StencilComp ("Stencil Comparison", Float) = 8
_Stencil ("Stencil ID", Float) = 0 _Stencil ("Stencil ID", Float) = 0
_StencilOp ("Stencil Operation", Float) = 0 _StencilOp ("Stencil Operation", Float) = 0
@ -37,14 +37,14 @@ Shader "ConformalDecals/UI/Color Swatch"
ReadMask [_StencilReadMask] ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask] WriteMask [_StencilWriteMask]
} }
Cull Off Cull Off
Lighting Off Lighting Off
ZWrite Off ZWrite Off
ZTest [unity_GUIZTestMode] ZTest [unity_GUIZTestMode]
Blend SrcAlpha OneMinusSrcAlpha Blend SrcAlpha OneMinusSrcAlpha
ColorMask [_ColorMask] ColorMask [_ColorMask]
Pass Pass
{ {
CGPROGRAM CGPROGRAM
@ -56,7 +56,7 @@ Shader "ConformalDecals/UI/Color Swatch"
#include "UnityCG.cginc" #include "UnityCG.cginc"
#include "UnityUI.cginc" #include "UnityUI.cginc"
#include "HSL.cginc" #include "HSL.cginc"
#include "SDF.cginc" #include "../SDF.cginc"
#pragma multi_compile_local _ UNITY_UI_CLIP_RECT #pragma multi_compile_local _ UNITY_UI_CLIP_RECT
#pragma multi_compile_local _ UNITY_UI_ALPHACLIP #pragma multi_compile_local _ UNITY_UI_ALPHACLIP

View File

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 470 KiB

After

Width:  |  Height:  |  Size: 470 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

Before

Width:  |  Height:  |  Size: 260 B

After

Width:  |  Height:  |  Size: 260 B

View File

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

Before

Width:  |  Height:  |  Size: 169 B

After

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@ -1,46 +0,0 @@
using System;
using UnityEngine;
[ExecuteInEditMode]
public class DecalProjectorTest : MonoBehaviour
{
public GameObject target = null;
public Material targetMaterial = null;
public MeshRenderer targetRenderer;
public float aspectRatio = 1.0f;
public float size = 1.0f;
public float factor = 1.0f;
private Matrix4x4 _projectionMatrix;
private Matrix4x4 _OrthoMatrix;
private int _matrixID;
private int _normalID;
public int _tangentID;
// Start is called before the first frame update
void Awake()
{
_projectionMatrix = Matrix4x4.identity;
targetRenderer = target.GetComponent<MeshRenderer>();
}
// Update is called once per frame
void Update()
{
Vector3 pos =new Vector3( 0.5f ,0.5f, 0);
Vector3 scale = new Vector3(1 / size, 1 / (aspectRatio * size), 1);
_OrthoMatrix.SetTRS(pos, Quaternion.identity, scale);
//Debug.Log(_OrthoMatrix);
var targetToProjector = transform.worldToLocalMatrix * targetRenderer.localToWorldMatrix;
var projectorToTarget = targetRenderer.worldToLocalMatrix * transform.localToWorldMatrix;
_projectionMatrix = _OrthoMatrix * targetToProjector;
targetMaterial.SetMatrix("_ProjectionMatrix", _projectionMatrix);
targetMaterial.SetVector("_DecalNormal", projectorToTarget.MultiplyVector(Vector3.back).normalized);
targetMaterial.SetVector("_DecalTangent", projectorToTarget.MultiplyVector(Vector3.right).normalized);
}
}

View File

@ -1,119 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.Rendering;
public class TextRenderTest : MonoBehaviour {
//[InspectorButton("go")] public bool button;
public Camera _camera;
public GameObject _cameraObject;
public TextMeshPro _tmp;
public Material _blitMaterial;
public Material _targetMaterial;
public RenderTexture renderTex;
private float pixelDensity = 8;
private int MaxTextureSize = 4096;
private static readonly int Decal = Shader.PropertyToID("_Decal");
public const TextureFormat TextTextureFormat = TextureFormat.RG16;
public const RenderTextureFormat TextRenderTextureFormat = RenderTextureFormat.R8;
// Start is called before the first frame update
void Start() {
Debug.Log("starting...");
StartCoroutine(OnRender());
var thing = new GameObject();
thing.AddComponent<TextMeshPro>();
}
// Update is called once per frame
void Update() { }
private IEnumerator OnRender() {
Debug.Log("starting...2");
// calculate camera and texture size
_tmp.ForceMeshUpdate();
var mesh = _tmp.mesh;
mesh.RecalculateBounds();
var bounds = mesh.bounds;
Debug.Log(bounds.size);
var width = bounds.size.x * pixelDensity;
var height = bounds.size.y * pixelDensity;
var widthPoT = Mathf.NextPowerOfTwo((int) width);
var heightPoT = Mathf.NextPowerOfTwo((int) height);
if (widthPoT > MaxTextureSize) {
widthPoT /= widthPoT / MaxTextureSize;
heightPoT /= widthPoT / MaxTextureSize;
}
if (heightPoT > MaxTextureSize) {
widthPoT /= heightPoT / MaxTextureSize;
heightPoT /= heightPoT / MaxTextureSize;
}
widthPoT = Mathf.Min(widthPoT, MaxTextureSize);
heightPoT = Mathf.Min(heightPoT, MaxTextureSize);
var widthRatio = widthPoT / width;
var heightRatio = heightPoT / height;
var sizeRatio = Mathf.Min(widthRatio, heightRatio);
Debug.Log(sizeRatio);
int scaledHeight = (int) (sizeRatio * height);
int scaledWidth = (int) (sizeRatio * width);
Debug.Log($"width = {scaledWidth}");
Debug.Log($"height = {scaledHeight}");
_camera.orthographicSize = scaledHeight / pixelDensity / 2;
_camera.aspect = (float) widthPoT / heightPoT;
_cameraObject.transform.localPosition = new Vector3(bounds.center.x, bounds.center.y, -1);
var halfHeight = heightPoT / pixelDensity / 2 / sizeRatio;
var halfWidth = widthPoT / pixelDensity / 2 / sizeRatio;
var matrix = Matrix4x4.Ortho(bounds.center.x - halfWidth, bounds.center.x + halfWidth,
bounds.center.y - halfHeight, bounds.center.y + halfHeight, -1, 1);
// setup texture
var texture = new Texture2D(widthPoT, heightPoT, TextTextureFormat, true);
_targetMaterial.SetTexture(Decal, texture);
// setup render texture
renderTex = RenderTexture.GetTemporary(widthPoT, heightPoT, 0, TextRenderTextureFormat, RenderTextureReadWrite.Linear, 1);
renderTex.autoGenerateMips = false;
RenderTexture.active = renderTex;
GL.PushMatrix();
GL.LoadProjectionMatrix(matrix);
_blitMaterial.SetPass(0);
Graphics.DrawMeshNow(mesh, Matrix4x4.identity);
GL.PopMatrix();
// setup material
_blitMaterial.mainTexture = _tmp.font.atlas;
yield return null;
RenderTexture.active = renderTex;
texture.ReadPixels(new Rect(0, 0, widthPoT, heightPoT), 0, 0, true);
texture.Apply(false, true);
RenderTexture.ReleaseTemporary(renderTex);
}
}

View File

@ -1,156 +0,0 @@
#ifndef DECALS_COMMON_INCLUDED
#define DECALS_COMMON_INCLUDED
#include "AutoLight.cginc"
#include "Lighting.cginc"
#define CLIP_MARGIN 0.05
#define EDGE_MARGIN 0.01
// UNIFORM VARIABLES
// Projection matrix, normal, and tangent vectors
float4x4 _ProjectionMatrix;
float3 _DecalNormal;
float3 _DecalTangent;
// Common Shading Paramaters
float _Cutoff;
float _DecalOpacity;
float4 _Background;
sampler2D _Decal;
float4 _Decal_ST;
// Variant Shading Parameters
#ifdef DECAL_BASE_NORMAL
sampler2D _BumpMap;
float4 _BumpMap_ST;
float _EdgeWearStrength;
float _EdgeWearOffset;
#endif //DECAL_BASE_NORMAL
#ifdef DECAL_BUMPMAP
sampler2D _BumpMap;
float4 _BumpMap_ST;
#endif //DECAL_BUMPMAP
#ifdef DECAL_SPECMAP
sampler2D _SpecMap;
float4 _SpecMap_ST;
// specular color is declared in a unity CGINC for some reason??
fixed _Shininess;
#endif //DECAL_SPECMAP
#ifdef DECAL_EMISSIVE
sampler2D _Emissive;
float4 _Emissive_ST;
fixed4 _Emissive_Color;
#endif //DECAL_EMISSIVE
// KSP EFFECTS
// opacity and color
float _Opacity;
float4 _Color;
float _RimFalloff;
float4 _RimColor;
// fog
float4 _LocalCameraPos;
float4 _LocalCameraDir;
float4 _UnderwaterFogColor;
float _UnderwaterMinAlphaFogDistance;
float _UnderwaterMaxAlbedoFog;
float _UnderwaterMaxAlphaFog;
float _UnderwaterAlbedoDistanceScalar;
float _UnderwaterAlphaDistanceScalar;
float _UnderwaterFogFactor;
// SURFACE INPUT STRUCT
struct DecalSurfaceInput
{
float3 uv;
float2 uv_decal;
#ifdef DECAL_BUMPMAP
float2 uv_bumpmap;
#endif //DECAL_BUMPMAP
#ifdef DECAL_SPECMAP
float2 uv_specmap;
#endif //DECAL_SPECMAP
#ifdef DECAL_EMISSIVE
float2 uv_emissive;
#endif //DECAL_EMISSIVE
#ifdef DECAL_BASE_NORMAL
float3 normal;
#endif //DECAL_BASE_NORMAL
float3 vertex_normal;
float3 viewDir;
float3 worldPosition;
};
struct appdata_decal
{
float4 vertex : POSITION;
float3 normal : NORMAL;
#if defined(DECAL_BASE_NORMAL) || defined(DECAL_PREVIEW)
float4 texcoord : TEXCOORD0;
float4 tangent : TANGENT;
#endif
};
struct v2f
{
UNITY_POSITION(pos);
float3 normal : NORMAL;
float4 uv_decal : TEXCOORD0;
#ifdef DECAL_BASE_NORMAL
float2 uv_base : TEXCOORD1;
#endif //DECAL_BASE_NORMAL
float4 tSpace0 : TEXCOORD2;
float4 tSpace1 : TEXCOORD3;
float4 tSpace2 : TEXCOORD4;
#ifdef UNITY_PASS_FORWARDBASE
fixed3 vlight : TEXCOORD5;
UNITY_SHADOW_COORDS(6)
#endif //UNITY_PASS_FORWARDBASE
#ifdef UNITY_PASS_FORWARDADD
UNITY_LIGHTING_COORDS(5,6)
#endif //UNITY_PASS_FORWARDADD
};
inline void decalClipAlpha(float alpha) {
#ifndef DECAL_PREVIEW
clip(alpha - 0.001);
#endif
}
inline float CalcMipLevel(float2 texture_coord) {
float2 dx = ddx(texture_coord);
float2 dy = ddy(texture_coord);
float delta_max_sqr = max(dot(dx, dx), dot(dy, dy));
return 0.5 * log2(delta_max_sqr);
}
inline float BoundsDist(float3 p, float3 normal, float3 projNormal) {
float3 q = abs(p - 0.5) - 0.5; // 1x1 square/cube centered at (0.5,0.5)
//float dist = length(max(q,0)) + min(max(q.x,max(q.y,q.z)),0.0); // true SDF
#ifdef DECAL_PREVIEW
return 10 * max(q.x, q.y); // 2D pseudo SDF
#else
float dist = max(max(q.x, q.y), q.z); // pseudo SDF
float ndist = EDGE_MARGIN - dot(normal, projNormal); // SDF to normal
return 10 * max(dist, ndist); // return intersection
#endif //DECAL_PREVIEW
}
#endif

View File

@ -1,33 +0,0 @@
#ifndef DECALS_LIGHTING_INCLUDED
#define DECALS_LIGHTING_INCLUDED
// modifed version of the KSP BlinnPhong because it does some weird things
inline fixed4 LightingBlinnPhongDecal(SurfaceOutput s, fixed3 lightDir, half3 viewDir, fixed atten)
{
s.Normal = normalize(s.Normal);
half3 h = normalize(lightDir + viewDir);
fixed diff = max(0, dot(s.Normal, lightDir));
float nh = max(0, dot(s.Normal, h));
float spec = pow(nh, s.Specular*128.0) * s.Gloss;
fixed4 c = 0;
c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * _SpecColor.rgb * spec) * (atten);
return c;
}
// KSP underwater fog function
float4 UnderwaterFog(float3 worldPos, float3 color)
{
float3 toPixel = worldPos - _LocalCameraPos.xyz;
float toPixelLength = length(toPixel);
float underwaterDetection = _UnderwaterFogFactor * _LocalCameraDir.w;
float albedoLerpValue = underwaterDetection * (_UnderwaterMaxAlbedoFog * saturate(toPixelLength * _UnderwaterAlbedoDistanceScalar));
float alphaFactor = 1 - underwaterDetection * (_UnderwaterMaxAlphaFog * saturate((toPixelLength - _UnderwaterMinAlphaFogDistance) * _UnderwaterAlphaDistanceScalar));
return float4(lerp(color, _UnderwaterFogColor.rgb, albedoLerpValue), alphaFactor);
}
#endif

View File

@ -1,183 +0,0 @@
#ifndef DECALS_SURFACE_INCLUDED
#define DECALS_SURFACE_INCLUDED
#include "DecalsCommon.cginc"
#include "DecalsLighting.cginc"
// declare surf function,
// this must be defined in any shader using this cginc
void surf (DecalSurfaceInput IN, inout SurfaceOutput o);
v2f vert_forward(appdata_decal v)
{
v2f o;
UNITY_INITIALIZE_OUTPUT(v2f,o);
o.pos = UnityObjectToClipPos(v.vertex);
o.normal = v.normal;
#ifdef DECAL_PREVIEW
o.uv_decal = v.texcoord;
#else
o.uv_decal = mul (_ProjectionMatrix, v.vertex);
#endif //DECAL_PREVIEW
#ifdef DECAL_BASE_NORMAL
o.uv_base = TRANSFORM_TEX(v.texcoord, _BumpMap);
#endif //DECAL_BASE_NORMAL
float3 worldPosition = mul(unity_ObjectToWorld, v.vertex).xyz;
float3 worldNormal = UnityObjectToWorldNormal(v.normal);
#if defined(DECAL_BASE_NORMAL) || defined(DECAL_PREVIEW)
// use tangent of base geometry
fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);
fixed tangentSign = v.tangent.w * unity_WorldTransformParams.w;
fixed3 worldBinormal = cross(worldNormal, worldTangent) * tangentSign;
#else
// use tangent of projector
fixed3 decalTangent = UnityObjectToWorldDir(_DecalTangent);
fixed3 worldBinormal = cross(decalTangent, worldNormal);
fixed3 worldTangent = cross(worldNormal, worldBinormal);
#endif //defined(DECAL_BASE_NORMAL) || defined(DECAL_PREVIEW)
o.tSpace0 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPosition.x);
o.tSpace1 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPosition.y);
o.tSpace2 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPosition.z);
// forward base pass specific lighting code
#ifdef UNITY_PASS_FORWARDBASE
// SH/ambient light
#if UNITY_SHOULD_SAMPLE_SH
float3 shlight = ShadeSH9 (float4(worldNormal,1.0));
o.vlight = shlight;
#else
o.vlight = 0.0;
#endif // UNITY_SHOULD_SAMPLE_SH
// vertex light
#ifdef VERTEXLIGHT_ON
o.vlight += Shade4PointLights (
unity_4LightPosX0, unity_4LightPosY0, unity_4LightPosZ0,
unity_LightColor[0].rgb, unity_LightColor[1].rgb, unity_LightColor[2].rgb, unity_LightColor[3].rgb,
unity_4LightAtten0, worldPosition, worldNormal );
#endif // VERTEXLIGHT_ON
#endif // UNITY_PASS_FORWARDBASE
// pass shadow and, possibly, light cookie coordinates to pixel shader
UNITY_TRANSFER_LIGHTING(o, 0.0);
return o;
}
fixed4 frag_forward(v2f IN) : SV_Target
{
#ifdef DECAL_PREVIEW
fixed4 uv_projected = IN.uv_decal;
#else
// perform decal projection
fixed4 uv_projected = UNITY_PROJ_COORD(IN.uv_decal);
clip(uv_projected.xyz + CLIP_MARGIN);
clip(CLIP_MARGIN + (1-uv_projected.xyz));
#endif //DECAL_PREVIEW
// declare data
DecalSurfaceInput i;
SurfaceOutput o;
// setup world-space TBN vectors
UNITY_EXTRACT_TBN(IN);
float3 worldPosition = float3(IN.tSpace0.w, IN.tSpace1.w, IN.tSpace2.w);
float3 worldTangent = float3(IN.tSpace0.x, IN.tSpace1.x, IN.tSpace2.x);
// setup world-space light and view direction vectors
#ifndef USING_DIRECTIONAL_LIGHT
fixed3 lightDir = normalize(UnityWorldSpaceLightDir(worldPosition));
#else
fixed3 lightDir = _WorldSpaceLightPos0.xyz;
#endif
float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPosition));
float3 viewDir = _unity_tbn_0 * worldViewDir.x + _unity_tbn_1 * worldViewDir.y + _unity_tbn_2 * worldViewDir.z;
// initialize surface input
UNITY_INITIALIZE_OUTPUT(DecalSurfaceInput, i)
i.uv_decal = TRANSFORM_TEX(uv_projected, _Decal);
i.uv = uv_projected;
#ifdef DECAL_BUMPMAP
i.uv_bumpmap = TRANSFORM_TEX(uv_projected, _BumpMap);
#endif //DECAL_BUMPMAP
#ifdef DECAL_SPECMAP
i.uv_specmap = TRANSFORM_TEX(uv_projected, _SpecMap);
#endif //DECAL_SPECMAP
#ifdef DECAL_EMISSIVE
i.uv_emissive = TRANSFORM_TEX(uv_projected, _Emissive);
#endif //DECAL_EMISSIVE
#ifdef DECAL_BASE_NORMAL
#ifdef DECAL_PREVIEW
i.normal = fixed3(0,0,1);
#else
i.normal = UnpackNormalDXT5nm(tex2D(_BumpMap, IN.uv_base));
#endif //DECAL_PREVIEW
#endif //DECAL_BASE_NORMAL
i.vertex_normal = IN.normal;
i.viewDir = viewDir;
i.worldPosition = worldPosition;
// initialize surface output
o.Albedo = 0.0;
o.Emission = 0.0;
o.Specular = 0.0;
o.Alpha = 0.0;
o.Gloss = 0.0;
o.Normal = fixed3(0,0,1);
// call surface function
surf(i, o);
#ifdef DECAL_PREVIEW
if (any(IN.uv_decal > 1) || any(IN.uv_decal < 0)) o.Alpha = 0;
o.Albedo = lerp(_Background.rgb, o.Albedo, o.Alpha) * _Color.rgb;
o.Normal = lerp(float3(0,0,1), o.Normal, o.Alpha);
o.Gloss = lerp(_Background.a, o.Gloss, o.Alpha);
o.Emission = lerp(0, o.Emission, o.Alpha);
o.Alpha = _Opacity;
#endif //DECAL_PREVIEW
// compute lighting & shadowing factor
UNITY_LIGHT_ATTENUATION(atten, IN, worldPosition)
// compute world normal
float3 WorldNormal;
WorldNormal.x = dot(_unity_tbn_0, o.Normal);
WorldNormal.y = dot(_unity_tbn_1, o.Normal);
WorldNormal.z = dot(_unity_tbn_2, o.Normal);
WorldNormal = normalize(WorldNormal);
o.Normal = WorldNormal;
//call modified KSP lighting function
float4 c = LightingBlinnPhongDecal(o, lightDir, worldViewDir, atten);
// Forward base emission and ambient/vertex lighting
#ifdef UNITY_PASS_FORWARDBASE
c.rgb += o.Emission;
c.rgb += o.Albedo * IN.vlight;
c.a = o.Alpha;
#endif //UNITY_PASS_FORWARDBASE
// Forward add multiply by alpha
#ifdef UNITY_PASS_FORWARDADD
c.rgb *= o.Alpha;
#endif
return c;
}
#endif

View File

@ -1,102 +0,0 @@
#ifndef LIGHTING_KSP_INCLUDED
#define LIGHTING_KSP_INCLUDED
inline fixed4 LightingBlinnPhongSmooth(SurfaceOutput s, fixed3 lightDir, half3 viewDir, fixed atten)
{
s.Normal = normalize(s.Normal);
half3 h = normalize(lightDir + viewDir);
fixed diff = max(0, dot(s.Normal, lightDir));
float nh = max(0, dot(s.Normal, h));
float spec = pow(nh, s.Specular*128.0) * s.Gloss;
fixed4 c;
c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * _SpecColor.rgb * spec) * (atten);
c.a = s.Alpha + _LightColor0.a * _SpecColor.a * spec * atten;
return c;
}
inline half4 LightingUnlit(SurfaceOutput s, half3 lightDir, half atten)
{
// half diff = max (0, dot (s.Normal, lightDir));
half4 c;
c.rgb = s.Albedo;
c.a = s.Alpha;
return c;
}
inline half4 LightingUnlit_PrePass(SurfaceOutput s, half4 light)
{
half4 c;
c.rgb = s.Albedo;
c.a = s.Alpha;
return c;
}
fixed4 LightingNoLighting(SurfaceOutput s, fixed3 lightDir, fixed atten) { return fixed4(0, 0, 0, 0); }
float4 _Color;
half _LightBoost;
half4 LightingLightWrapped(SurfaceOutput s, half3 lightDir, half3 viewDir, half atten) {
float3 w = _Color.rgb*0.5;
half3 NdotL = dot(s.Normal, lightDir);
//Specular term
half3 h = normalize(lightDir + viewDir);
s.Normal = normalize(s.Normal);
float NdotH = dot(s.Normal, h);
float spec = pow(max(NdotH, 0), s.Specular * 128.0) * s.Gloss;
fixed3 specColor = _SpecColor.rgb * _LightColor0.rgb;
half3 diff = NdotL * (1 - w) + w;
half4 c;
c.rgb = ((s.Albedo * _LightColor0.rgb * diff) + (specColor * spec)) * (atten * _LightBoost);
c.a = s.Alpha + (_LightColor0.a * _SpecColor.a * spec * atten);
return c;
}
float4 _LocalCameraPos;
float4 _LocalCameraDir;
float4 _UnderwaterFogColor;
float _UnderwaterMinAlphaFogDistance;
float _UnderwaterMaxAlbedoFog;
float _UnderwaterMaxAlphaFog;
float _UnderwaterAlbedoDistanceScalar;
float _UnderwaterAlphaDistanceScalar;
float _UnderwaterFogFactor;
float4 UnderwaterFog(float3 worldPos, float3 color)
{
float3 toPixel = worldPos - _LocalCameraPos.xyz;
float toPixelLength = length(toPixel); ///< Comment out the math--looks better without it.
//float angleDot = dot(_LocalCameraDir.xyz, toPixel / toPixelLength);
//angleDot = lerp(0.00000001, angleDot, saturate(sign(angleDot)));
//float waterDist = -_LocalCameraPos.w / angleDot;
//float dist = min(toPixelLength, waterDist);
float underwaterDetection = _UnderwaterFogFactor * _LocalCameraDir.w; ///< sign(1 - sign(_LocalCameraPos.w));
float albedoLerpValue = underwaterDetection * (_UnderwaterMaxAlbedoFog * saturate(toPixelLength * _UnderwaterAlbedoDistanceScalar));
float alphaFactor = 1 - underwaterDetection * (_UnderwaterMaxAlphaFog * saturate((toPixelLength - _UnderwaterMinAlphaFogDistance) * _UnderwaterAlphaDistanceScalar));
return float4(lerp(color, _UnderwaterFogColor.rgb, albedoLerpValue), alphaFactor);
}
#endif

View File

@ -1,111 +0,0 @@
Shader "ConformalDecals/Decal/Standard"
{
Properties
{
[Header(Decal)]
_Decal("Decal Texture", 2D) = "gray" {}
[Toggle(DECAL_SDF_ALPHA)] _Decal_SDF_Alpha ("SDF in Alpha", int) = 0
[Header(Normal)]
[Toggle(DECAL_BASE_NORMAL)] _BaseNormal ("Use Base Normal", int) = 0
[Toggle(DECAL_BUMPMAP)] _Decal_BumpMap ("Has BumpMap", int) = 0
_BumpMap("Bump Map", 2D) = "bump" {}
_EdgeWearStrength("Edge Wear Strength", Range(0,500)) = 100
_EdgeWearOffset("Edge Wear Offset", Range(0,1)) = 0.1
[Header(Specularity)]
[Toggle(DECAL_SPECMAP)] _Decal_SpecMap ("Has SpecMap", int) = 0
_SpecMap ("Specular Map)", 2D) = "black" {}
_SpecColor ("_SpecColor", Color) = (0.25, 0.25, 0.25, 1)
_Shininess ("Shininess", Range (0.03, 10)) = 0.3
[Header(Emissive)]
[Toggle(DECAL_EMISSIVE)] _Decal_Emissive ("Has Emissive", int) = 0
_Emissive("_Emissive", 2D) = "black" {}
_EmissiveColor("_EmissiveColor", Color) = (0,0,0,1)
_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
_DecalOpacity("Opacity", Range(0,1) ) = 1
_Background("Background Color", Color) = (0.9,0.9,0.9,0.7)
[Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull", int) = 2
[Toggle] _ZWrite ("ZWrite", Float) = 1.0
[Toggle(DECAL_PREVIEW)] _Preview ("Preview", int) = 0
[Header(Effects)]
[PerRendererData]_Opacity("_Opacity", Range(0,1) ) = 1
[PerRendererData]_Color("_Color", Color) = (1,1,1,1)
[PerRendererData]_RimFalloff("_RimFalloff", Range(0.01,5) ) = 0.1
[PerRendererData]_RimColor("_RimColor", Color) = (0,0,0,0)
[PerRendererData]_UnderwaterFogFactor ("Underwater Fog Factor", Range(0,1)) = 0
}
SubShader
{
Tags { "Queue" = "Geometry+100" "IgnoreProjector" = "true" "DisableBatching" = "true"}
Cull [_Cull]
Pass
{
Name "FORWARD"
Tags { "LightMode" = "ForwardBase" }
ZWrite [_ZWrite]
ZTest LEqual
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert_forward
#pragma fragment frag_forward
#pragma multi_compile_fwdbase nolightmap nodirlightmap nodynlightmap
#pragma skip_variants SHADOWS_DEPTH SHADOWS_CUBE SHADOWS_SHADOWMASK LIGHTMAP_SHADOW_MIXING POINT_COOKIE
#pragma multi_compile_local __ DECAL_PREVIEW
#pragma multi_compile_local __ DECAL_BASE_NORMAL DECAL_BUMPMAP
#pragma multi_compile_local __ DECAL_SPECMAP
#pragma multi_compile_local __ DECAL_EMISSIVE
#pragma multi_compile_local __ DECAL_SDF_ALPHA
#include "UnityCG.cginc"
#include "DecalsCommon.cginc"
#include "DecalsSurface.cginc"
#include "SDF.cginc"
#include "StandardDecal.cginc"
ENDCG
}
Pass
{
Name "FORWARD"
Tags { "LightMode" = "ForwardAdd" }
ZWrite Off
ZTest LEqual
Blend One One
Offset -1, -1
CGPROGRAM
#pragma vertex vert_forward
#pragma fragment frag_forward
#pragma multi_compile_fwdadd nolightmap nodirlightmap nodynlightmap
#pragma skip_variants SHADOWS_DEPTH SHADOWS_CUBE SHADOWS_SHADOWMASK LIGHTMAP_SHADOW_MIXING POINT_COOKIE
#pragma multi_compile_local __ DECAL_PREVIEW
#pragma multi_compile_local __ DECAL_BASE_NORMAL DECAL_BUMPMAP
#pragma multi_compile_local __ DECAL_SPECMAP
#pragma multi_compile_local __ DECAL_EMISSIVE
#pragma multi_compile_local __ DECAL_SDF_ALPHA
#include "UnityCG.cginc"
#include "DecalsCommon.cginc"
#include "DecalsSurface.cginc"
#include "SDF.cginc"
#include "StandardDecal.cginc"
ENDCG
}
// shadow casting support
UsePass "Legacy Shaders/VertexLit/SHADOWCASTER"
}
}

View File

@ -1,112 +0,0 @@
Shader "ConformalDecals/Decal/Text"
{
Properties
{
[Header(Decal)]
[Toggle(DECAL_FILL)] _Fill ("Fill", int) = 0
_Decal("Decal Texture", 2D) = "gray" {}
_DecalColor("Decal Color", Color) = (1,1,1,1)
_Weight("Text Weight", Range(0,1)) = 0
[Header(Outline)]
[Toggle(DECAL_OUTLINE)] _Outline ("Outline", int) = 0
_OutlineColor("Outline Color", Color) = (0,0,0,1)
_OutlineWidth("Outline Width", Range(0,1)) = 0.1
[Header(Normal)]
[Toggle(DECAL_BASE_NORMAL)] _BaseNormal ("Use Base Normal", int) = 0
_BumpMap("Bump Map", 2D) = "bump" {}
_EdgeWearStrength("Edge Wear Strength", Range(0,500)) = 100
_EdgeWearOffset("Edge Wear Offset", Range(0,1)) = 0.1
[Header(Specularity)]
[Toggle(DECAL_SPECMAP)] _Decal_SpecMap ("Has SpecMap", int) = 0
_SpecMap ("Specular Map)", 2D) = "black" {}
_SpecColor ("_SpecColor", Color) = (0.25, 0.25, 0.25, 1)
_Shininess ("Shininess", Range (0.03, 10)) = 0.3
_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
_DecalOpacity("Opacity", Range(0,1) ) = 1
_Background("Background Color", Color) = (0.9,0.9,0.9,0.7)
[Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull", int) = 2
[Toggle] _ZWrite ("ZWrite", Float) = 1.0
[Toggle(DECAL_PREVIEW)] _Preview ("Preview", int) = 0
[Header(Effects)]
[PerRendererData]_Opacity("_Opacity", Range(0,1) ) = 1
_Color("_Color", Color) = (1,1,1,1)
[PerRendererData]_RimFalloff("_RimFalloff", Range(0.01,5) ) = 0.1
[PerRendererData]_RimColor("_RimColor", Color) = (0,0,0,0)
[PerRendererData]_UnderwaterFogFactor ("Underwater Fog Factor", Range(0,1)) = 0
}
SubShader
{
Tags { "Queue" = "Geometry+100" "IgnoreProjector" = "true" "DisableBatching" = "true"}
Cull [_Cull]
Pass
{
Name "FORWARD"
Tags { "LightMode" = "ForwardBase" }
ZWrite [_ZWrite]
ZTest LEqual
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert_forward
#pragma fragment frag_forward
#pragma multi_compile_fwdbase nolightmap nodirlightmap nodynlightmap
#pragma skip_variants SHADOWS_DEPTH SHADOWS_CUBE SHADOWS_SHADOWMASK LIGHTMAP_SHADOW_MIXING POINT_COOKIE
#pragma multi_compile_local __ DECAL_PREVIEW
#pragma multi_compile_local __ DECAL_BASE_NORMAL
#pragma multi_compile_local __ DECAL_SPECMAP
#pragma multi_compile_local __ DECAL_OUTLINE
#pragma multi_compile_local __ DECAL_FILL
#include "UnityCG.cginc"
#include "DecalsCommon.cginc"
#include "DecalsSurface.cginc"
#include "SDF.cginc"
#include "TextDecal.cginc"
ENDCG
}
Pass
{
Name "FORWARD"
Tags { "LightMode" = "ForwardAdd" }
ZWrite Off
ZTest LEqual
Blend One One
Offset -1, -1
CGPROGRAM
#pragma vertex vert_forward
#pragma fragment frag_forward
#pragma multi_compile_fwdadd nolightmap nodirlightmap nodynlightmap
#pragma skip_variants SHADOWS_DEPTH SHADOWS_CUBE SHADOWS_SHADOWMASK LIGHTMAP_SHADOW_MIXING POINT_COOKIE
#pragma multi_compile_local __ DECAL_PREVIEW
#pragma multi_compile_local __ DECAL_BASE_NORMAL
#pragma multi_compile_local __ DECAL_SPECMAP
#pragma multi_compile_local __ DECAL_OUTLINE
#pragma multi_compile_local __ DECAL_FILL
#include "UnityCG.cginc"
#include "DecalsCommon.cginc"
#include "DecalsSurface.cginc"
#include "SDF.cginc"
#include "TextDecal.cginc"
ENDCG
}
// shadow casting support
UsePass "Legacy Shaders/VertexLit/SHADOWCASTER"
}
}

View File

@ -8,6 +8,42 @@ All notable changes to this project will be documented in this file
| website | https://forum.kerbalspaceprogram.com/index.php?/topic/194802-18-111-conformal-decals | | website | https://forum.kerbalspaceprogram.com/index.php?/topic/194802-18-111-conformal-decals |
| author | Andrew Cassidy | | author | Andrew Cassidy |
## 0.2.14 - 2024-06-25
### Fixed
- Fixed parts showing as all black with the Deferred Rendering mod
## 0.2.13 - 2024-05-17
### Fixed
- Fixed flag decals sometimes not respecting image aspect ratio
## 0.2.12 - 2022-10-31
### Changed
- Updated bundled Shabby to 0.3.0. Does not affect CKAN users
- Made flag aspect ratio overrides configurable with `ASPECTRATIO` nodes in the config. User flags added to Squad/Flags should now be the correct aspect ratio
- All decal aspect ratios can now be overriden with the `aspectRatio` field
### Fixed
- Reverted some changes from last version that were causing issues on launch
## 0.2.11 - 2022-10-30
### Fixed
- PR by LinuxGuruGamer:
- Fixed nullref caused when an entry in `_targets` was null
- Fixed memory leak caused by the OnDestroy() methods not being called due to them being virtual
## 0.2.10 - 2022-03-14 ## 0.2.10 - 2022-03-14
### Fixed ### Fixed

Binary file not shown.

View File

@ -49,4 +49,309 @@ CONFORMALDECALS {
style = 32 style = 32
styleMask = 4 styleMask = 4
} }
ASPECTRATIO {
path = Squad/Flags/09
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/Sentinel_Flag
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/blorbs
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/bullseye
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/capsule
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/circles
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/default
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/hexagon
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/hexagonCircles
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/kerbal1
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/kerbal2
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/kerbin
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/kerbinmunflag
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/line
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/minimalistic
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/orbit
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/orbs
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/retro
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/rings
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/rocketScience
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/satellite
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/spheres
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/squadLogo
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/squadLogo2
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/stripes
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/trees
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Flags/trippy
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/FlagsAgency/NASA
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/FlagsAgency/esa_dark_blue
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/FlagsAgency/uk_space_agency
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/FlagsOrganization/B612_Foundation_flag
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/FlagsOrganization/ESA_Arianespace
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/FlagsOrganization/electron
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/FlagsOrganization/rocketlab
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/C7AerospaceDivision
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/DinkelsteinKermansConstructionEmporium
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/ExperimentalEngineering
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/FlooydResearchLab
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/GoliathNationalProducts
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/IntegratedIntegrals
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/IonicSymphonicProtonicElectronics
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/JebsJunkyard
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/KerbalMotion
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/KerbinWorldFirstRecordKeepingSociety
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/Kerbodyne
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/Kerlington
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/MaxoConstructionToys
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/MovingPartsExpertsGroup
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/OMBDemolition
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/PeriapsisCo
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/Probodobodyne
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/R&D
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/ReactionSystemsLtd
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/Rockomax
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/Rokea
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/SeansCannery
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/SteadlerEngineeringCorps
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/StrutCo
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/Vac-Co
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/WinterOwl
aspectRatio = 0.625
}
ASPECTRATIO {
path = Squad/Agencies/ZaltonicElectronics
aspectRatio = 0.625
}
} }

View File

@ -1,5 +1,5 @@
# Conformal Decals # 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) [![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) [![CKAN: Indexed](https://img.shields.io/badge/CKAN-Indexed-brightgreen.svg)](https://github.com/KSP-CKAN/CKAN)
![Screenshot](http://pileof.rocks/KSP/images/ConformalDecalsHeader.png) ![Screenshot](http://pileof.rocks/KSP/images/ConformalDecalsHeader.png)
@ -8,7 +8,7 @@ Conformal Decals adds a set of decal stickers to KSP, as well as providing a fra
## Dependencies ## Dependencies
Required: Required:
- KSP (1.8.x to 1.10.x) - KSP (1.8.x to 1.12.x)
- B9 Part Switch (2.18.0). Bundled with release. - B9 Part Switch (2.18.0). Bundled with release.
- ModuleManager (4.1.4). Bundled with release. - ModuleManager (4.1.4). Bundled with release.
- Shabby (0.2.0 unofficial build). Bundled with release. - Shabby (0.2.0 unofficial build). Bundled with release.

View File

@ -8,6 +8,11 @@
<AssemblyVersion>9.9.9</AssemblyVersion> <AssemblyVersion>9.9.9</AssemblyVersion>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DefineConstants>DEBUG;TRACE;ENABLE_PROFILER</DefineConstants>
<DebugType>portable</DebugType>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"> <Reference Include="Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null">
<HintPath>dlls\Assembly-CSharp.dll</HintPath> <HintPath>dlls\Assembly-CSharp.dll</HintPath>
@ -49,6 +54,7 @@
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="/bin/cp -v '$(OutDir)ConformalDecals.dll' '$(SolutionDir)../GameData/ConformalDecals/Plugins/ConformalDecals.dll'" IgnoreExitCode="true"/> <Exec Command="/bin/cp -v '$(OutDir)ConformalDecals.dll' '$(SolutionDir)../GameData/ConformalDecals/Plugins/ConformalDecals.dll'" IgnoreExitCode="true"/>
<Exec Command="/bin/cp -v '$(OutDir)ConformalDecals.pdb' '$(SolutionDir)../GameData/ConformalDecals/Plugins/ConformalDecals.pdb'" IgnoreExitCode="true"/>
<!--Fuck you MSBuild stop trying to run CMD.exe on macOS--> <!--Fuck you MSBuild stop trying to run CMD.exe on macOS-->
</Target> </Target>

View File

@ -15,6 +15,7 @@ namespace ConformalDecals {
private static Dictionary<string, DecalFont> _fontList; private static Dictionary<string, DecalFont> _fontList;
private static int _decalLayer = 31; private static int _decalLayer = 31;
private static bool _selectableInFlight; private static bool _selectableInFlight;
private static Dictionary<string, float> _aspectRatios;
private struct LegacyShaderEntry { private struct LegacyShaderEntry {
public string name; public string name;
@ -53,6 +54,8 @@ namespace ConformalDecals {
public static IEnumerable<DecalFont> Fonts => _fontList.Values; public static IEnumerable<DecalFont> Fonts => _fontList.Values;
public static Dictionary<string, float> AspectRatios => _aspectRatios;
public static bool IsBlacklisted(Shader shader) { public static bool IsBlacklisted(Shader shader) {
return IsBlacklisted(shader.name); return IsBlacklisted(shader.name);
} }
@ -86,8 +89,7 @@ namespace ConformalDecals {
public static DecalFont GetFont(string name) { public static DecalFont GetFont(string name) {
if (_fontList.TryGetValue(name, out var font)) { if (_fontList.TryGetValue(name, out var font)) {
return font; return font;
} } else {
else {
throw new KeyNotFoundException($"Font {name} not found"); throw new KeyNotFoundException($"Font {name} not found");
} }
} }
@ -113,8 +115,17 @@ namespace ConformalDecals {
try { try {
var font = new DecalFont(fontNode, allFonts); var font = new DecalFont(fontNode, allFonts);
_fontList.Add(font.Name, font); _fontList.Add(font.Name, font);
} catch (Exception e) {
Debug.LogException(e);
} }
catch (Exception e) { }
foreach (var ratioNode in node.GetNodes("ASPECTRATIO")) {
try {
var path = ParseUtil.ParseString(ratioNode, "path");
var ratio = ParseUtil.ParseFloat(ratioNode, "aspectRatio");
_aspectRatios[path] = ratio;
} catch (Exception e) {
Debug.LogException(e); Debug.LogException(e);
} }
} }
@ -144,6 +155,7 @@ namespace ConformalDecals {
_shaderBlacklist = new List<string>(); _shaderBlacklist = new List<string>();
_shaderRegexBlacklist = new List<Regex>(); _shaderRegexBlacklist = new List<Regex>();
_fontList = new Dictionary<string, DecalFont>(); _fontList = new Dictionary<string, DecalFont>();
_aspectRatios = new Dictionary<string, float>();
var configs = GameDatabase.Instance.GetConfigs("CONFORMALDECALS"); var configs = GameDatabase.Instance.GetConfigs("CONFORMALDECALS");

View File

@ -45,6 +45,7 @@ namespace ConformalDecals.MaterialProperties {
_decalMaterial.SetInt(DecalPropertyIDs._Cull, (int) CullMode.Off); _decalMaterial.SetInt(DecalPropertyIDs._Cull, (int) CullMode.Off);
_decalMaterial.SetInt(DecalPropertyIDs._ZWrite, 0); _decalMaterial.SetInt(DecalPropertyIDs._ZWrite, 0);
_decalMaterial.renderQueue = RenderQueue; _decalMaterial.renderQueue = RenderQueue;
_decalMaterial.SetShaderPassEnabled("SHADOWCASTER", false);
} }
return _decalMaterial; return _decalMaterial;
@ -59,6 +60,7 @@ namespace ConformalDecals.MaterialProperties {
_previewMaterial.EnableKeyword("DECAL_PREVIEW"); _previewMaterial.EnableKeyword("DECAL_PREVIEW");
_previewMaterial.SetInt(DecalPropertyIDs._Cull, (int) CullMode.Back); _previewMaterial.SetInt(DecalPropertyIDs._Cull, (int) CullMode.Back);
_previewMaterial.SetInt(DecalPropertyIDs._ZWrite, 1); _previewMaterial.SetInt(DecalPropertyIDs._ZWrite, 1);
_previewMaterial.SetShaderPassEnabled("DEFERRED_PREPASS", false);
} }
return _previewMaterial; return _previewMaterial;
@ -75,7 +77,12 @@ namespace ConformalDecals.MaterialProperties {
} }
} }
public float AspectRatio => MainTexture == null ? 1 : MainTexture.AspectRatio; public float AspectRatio {
get => MainTexture == null ? 1 : MainTexture.AspectRatio;
set {
if (MainTexture != null) MainTexture.AspectRatio = value;
}
}
public void OnBeforeSerialize() { public void OnBeforeSerialize() {
if (_materialProperties == null) throw new SerializationException("Tried to serialize an uninitialized MaterialPropertyCollection"); if (_materialProperties == null) throw new SerializationException("Tried to serialize an uninitialized MaterialPropertyCollection");
@ -136,8 +143,7 @@ namespace ConformalDecals.MaterialProperties {
public T GetProperty<T>(string propertyName) where T : MaterialProperty { public T GetProperty<T>(string propertyName) where T : MaterialProperty {
if (_materialProperties.ContainsKey(propertyName) && _materialProperties[propertyName] is T property) { if (_materialProperties.ContainsKey(propertyName) && _materialProperties[propertyName] is T property) {
return property; return property;
} } else {
else {
return null; return null;
} }
} }
@ -145,8 +151,7 @@ namespace ConformalDecals.MaterialProperties {
public T AddOrGetProperty<T>(string propertyName) where T : MaterialProperty { public T AddOrGetProperty<T>(string propertyName) where T : MaterialProperty {
if (_materialProperties.ContainsKey(propertyName) && _materialProperties[propertyName] is T property) { if (_materialProperties.ContainsKey(propertyName) && _materialProperties[propertyName] is T property) {
return property; return property;
} } else {
else {
return AddProperty<T>(propertyName); return AddProperty<T>(propertyName);
} }
} }
@ -156,9 +161,10 @@ namespace ConformalDecals.MaterialProperties {
foreach (var material in Materials) { foreach (var material in Materials) {
property.Remove(material); property.Remove(material);
} }
_materialProperties.Remove(propertyName); _materialProperties.Remove(propertyName);
Destroy(property); Destroy(property);
return true; return true;
} }
@ -204,8 +210,7 @@ namespace ConformalDecals.MaterialProperties {
if (_shader == null) { if (_shader == null) {
Logging.Log("Using default decal shader"); Logging.Log("Using default decal shader");
shaderName = "ConformalDecals/Decal/Standard"; shaderName = "ConformalDecals/Decal/Standard";
} } else {
else {
return; return;
} }
} }

View File

@ -19,6 +19,8 @@ namespace ConformalDecals.MaterialProperties {
[SerializeField] private Vector2 _textureOffset; [SerializeField] private Vector2 _textureOffset;
[SerializeField] private Vector2 _textureScale = Vector2.one; [SerializeField] private Vector2 _textureScale = Vector2.one;
[SerializeField] private float _aspectRatioOverride = -1.0f;
public Texture2D Texture { public Texture2D Texture {
get => _texture; get => _texture;
set => _texture = value; set => _texture = value;
@ -43,10 +45,12 @@ namespace ConformalDecals.MaterialProperties {
public float AspectRatio { public float AspectRatio {
get { get {
if (_aspectRatioOverride > 0) return _aspectRatioOverride;
if (_texture == null) return 1; if (_texture == null) return 1;
if (_textureUrl?.Contains("Squad/Flags") == true) return 0.625f;
return MaskedHeight / (float) MaskedWidth; return MaskedHeight / (float) MaskedWidth;
} }
set => _aspectRatioOverride = value;
} }
public override void ParseNode(ConfigNode node) { public override void ParseNode(ConfigNode node) {
@ -64,7 +68,7 @@ namespace ConformalDecals.MaterialProperties {
if (ParseUtil.ParseStringIndirect(ref _textureUrl, node, "textureUrl")) { if (ParseUtil.ParseStringIndirect(ref _textureUrl, node, "textureUrl")) {
_texture = LoadTexture(_textureUrl, isNormal); _texture = LoadTexture(_textureUrl, isNormal);
} }
if (_texture == null) { if (_texture == null) {
_texture = isNormal ? DecalConfig.BlankNormal : Texture2D.whiteTexture; _texture = isNormal ? DecalConfig.BlankNormal : Texture2D.whiteTexture;
} }

View File

@ -35,6 +35,8 @@ namespace ConformalDecals {
[KSPField] public DecalScaleMode scaleMode = DecalScaleMode.HEIGHT; [KSPField] public DecalScaleMode scaleMode = DecalScaleMode.HEIGHT;
[KSPField] public float aspectRatio = -1.0f; // < 0 = use texture
[KSPField] public bool depthAdjustable = true; [KSPField] public bool depthAdjustable = true;
[KSPField] public float defaultDepth = 0.1f; [KSPField] public float defaultDepth = 0.1f;
[KSPField] public Vector2 depthRange = new Vector2(0, 2); [KSPField] public Vector2 depthRange = new Vector2(0, 2);
@ -122,8 +124,7 @@ namespace ConformalDecals {
if (materialProperties == null) { if (materialProperties == null) {
materialProperties = ScriptableObject.CreateInstance<MaterialPropertyCollection>(); materialProperties = ScriptableObject.CreateInstance<MaterialPropertyCollection>();
} } else {
else {
materialProperties = ScriptableObject.Instantiate(materialProperties); materialProperties = ScriptableObject.Instantiate(materialProperties);
} }
} }
@ -153,14 +154,12 @@ namespace ConformalDecals {
if (backRenderer == null) { if (backRenderer == null) {
this.LogError($"Specified decalBack transform {decalBack} has no renderer attached! Setting updateBackScale to false."); this.LogError($"Specified decalBack transform {decalBack} has no renderer attached! Setting updateBackScale to false.");
updateBackScale = false; updateBackScale = false;
} } else {
else {
backMaterial = backRenderer.material; backMaterial = backRenderer.material;
if (backMaterial == null) { if (backMaterial == null) {
this.LogError($"Specified decalBack transform {decalBack} has a renderer but no material! Setting updateBackScale to false."); this.LogError($"Specified decalBack transform {decalBack} has a renderer but no material! Setting updateBackScale to false.");
updateBackScale = false; updateBackScale = false;
} } else {
else {
if (backTextureBaseScale == default) backTextureBaseScale = backMaterial.GetTextureScale(PropertyIDs._MainTex); if (backTextureBaseScale == default) backTextureBaseScale = backMaterial.GetTextureScale(PropertyIDs._MainTex);
} }
} }
@ -201,12 +200,14 @@ namespace ConformalDecals {
if (tileRect.x >= 0) { if (tileRect.x >= 0) {
materialProperties.UpdateTile(tileRect); materialProperties.UpdateTile(tileRect);
} } else if (tileIndex >= 0) {
else if (tileIndex >= 0) {
materialProperties.UpdateTile(tileIndex, tileSize); materialProperties.UpdateTile(tileIndex, tileSize);
} }
}
catch (Exception e) { // handle aspect ratio overrides
materialProperties.AspectRatio = aspectRatio;
} catch (Exception e) {
this.LogException("Exception parsing partmodule", e); this.LogException("Exception parsing partmodule", e);
} }
@ -222,8 +223,7 @@ namespace ConformalDecals {
if (HighLogic.LoadedSceneIsGame) { if (HighLogic.LoadedSceneIsGame) {
UpdateScale(); UpdateScale();
} } else {
else {
scale = defaultScale; scale = defaultScale;
depth = defaultDepth; depth = defaultDepth;
opacity = defaultOpacity; opacity = defaultOpacity;
@ -250,6 +250,7 @@ namespace ConformalDecals {
if (HighLogic.LoadedSceneIsEditor) { if (HighLogic.LoadedSceneIsEditor) {
GameEvents.onEditorPartEvent.Add(OnEditorEvent); GameEvents.onEditorPartEvent.Add(OnEditorEvent);
GameEvents.onVariantApplied.Add(OnVariantApplied); GameEvents.onVariantApplied.Add(OnVariantApplied);
GameEvents.onEditorUndo.Add(OnEditorUndo);
UpdateTweakables(); UpdateTweakables();
} }
@ -261,8 +262,7 @@ namespace ConformalDecals {
// set initial attachment state // set initial attachment state
if (part.parent == null) { if (part.parent == null) {
OnDetach(); OnDetach();
} } else {
else {
OnAttach(); OnAttach();
} }
} }
@ -288,6 +288,7 @@ namespace ConformalDecals {
if (HighLogic.LoadedSceneIsEditor) { if (HighLogic.LoadedSceneIsEditor) {
GameEvents.onEditorPartEvent.Remove(OnEditorEvent); GameEvents.onEditorPartEvent.Remove(OnEditorEvent);
GameEvents.onVariantApplied.Remove(OnVariantApplied); GameEvents.onVariantApplied.Remove(OnVariantApplied);
GameEvents.onEditorUndo.Remove(OnEditorUndo);
} }
if (HighLogic.LoadedSceneIsFlight) { if (HighLogic.LoadedSceneIsFlight) {
@ -351,6 +352,10 @@ namespace ConformalDecals {
} }
} }
protected void OnEditorUndo(ShipConstruct sc) {
UpdateTargets();
}
protected void OnPartWillDie(Part willDie) { protected void OnPartWillDie(Part willDie) {
if (willDie == part.parent) { if (willDie == part.parent) {
this.Log("Parent part about to be destroyed! Killing decal part."); this.Log("Parent part about to be destroyed! Killing decal part.");
@ -400,30 +405,32 @@ namespace ConformalDecals {
protected void UpdateScale() { protected void UpdateScale() {
scale = Mathf.Max(0.01f, scale); scale = Mathf.Max(0.01f, scale);
depth = Mathf.Max(0.01f, depth); depth = Mathf.Max(0.01f, depth);
var aspectRatio = Mathf.Max(0.01f, materialProperties.AspectRatio);
var sizeRatio = Mathf.Max(0.01f, materialProperties.AspectRatio);
Vector2 size; Vector2 size;
switch (scaleMode) { switch (scaleMode) {
default: default:
case DecalScaleMode.HEIGHT: case DecalScaleMode.HEIGHT:
size = new Vector2(scale / aspectRatio, scale); size = new Vector2(scale / sizeRatio, scale);
break; break;
case DecalScaleMode.WIDTH: case DecalScaleMode.WIDTH:
size = new Vector2(scale, scale * aspectRatio); size = new Vector2(scale, scale * sizeRatio);
break; break;
case DecalScaleMode.AVERAGE: case DecalScaleMode.AVERAGE:
var width1 = 2 * scale / (1 + aspectRatio); var width1 = 2 * scale / (1 + sizeRatio);
size = new Vector2(width1, width1 * aspectRatio); size = new Vector2(width1, width1 * sizeRatio);
break; break;
case DecalScaleMode.AREA: case DecalScaleMode.AREA:
var width2 = Mathf.Sqrt(scale / aspectRatio); var width2 = Mathf.Sqrt(scale / sizeRatio);
size = new Vector2(width2, width2 * aspectRatio); size = new Vector2(width2, width2 * sizeRatio);
break; break;
case DecalScaleMode.MINIMUM: case DecalScaleMode.MINIMUM:
if (aspectRatio > 1) goto case DecalScaleMode.WIDTH; if (sizeRatio > 1) goto case DecalScaleMode.WIDTH;
else goto case DecalScaleMode.HEIGHT; else goto case DecalScaleMode.HEIGHT;
case DecalScaleMode.MAXIMUM: case DecalScaleMode.MAXIMUM:
if (aspectRatio > 1) goto case DecalScaleMode.HEIGHT; if (sizeRatio > 1) goto case DecalScaleMode.HEIGHT;
else goto case DecalScaleMode.WIDTH; else goto case DecalScaleMode.WIDTH;
} }
@ -440,10 +447,13 @@ namespace ConformalDecals {
// update projection // update projection
foreach (var target in _targets) { foreach (var target in _targets) {
target.Project(_orthoMatrix, decalProjectorTransform, _boundsRenderer.bounds, useBaseNormal); if (target.target == null) {
_targets.Remove(target);
} else {
target.Project(_orthoMatrix, decalProjectorTransform, _boundsRenderer.bounds, useBaseNormal);
}
} }
} } else {
else {
// rescale preview model // rescale preview model
decalModelTransform.localScale = new Vector3(size.x, size.y, (size.x + size.y) / 2); decalModelTransform.localScale = new Vector3(size.x, size.y, (size.x + size.y) / 2);
@ -471,8 +481,7 @@ namespace ConformalDecals {
protected void UpdateTargets() { protected void UpdateTargets() {
if (_targets == null) { if (_targets == null) {
_targets = new List<ProjectionTarget>(); _targets = new List<ProjectionTarget>();
} } else {
else {
_targets.Clear(); _targets.Clear();
} }
@ -481,7 +490,7 @@ namespace ConformalDecals {
foreach (var renderer in renderers) { foreach (var renderer in renderers) {
// skip disabled renderers // skip disabled renderers
if (renderer.gameObject.activeInHierarchy == false) continue; if (renderer.gameObject.activeInHierarchy == false) continue;
// skip blacklisted shaders // skip blacklisted shaders
if (DecalConfig.IsBlacklisted(renderer.material.shader)) continue; if (DecalConfig.IsBlacklisted(renderer.material.shader)) continue;
@ -574,10 +583,11 @@ namespace ConformalDecals {
public void Render(Camera camera) { public void Render(Camera camera) {
if (!_isAttached) return; if (!_isAttached) return;
// render on each target object // render on each target object
foreach (var target in _targets) { foreach (var target in _targets) {
target.Render(_decalMaterial, part.mpb, camera); if (ReferenceEquals(target.target, null)) _targets.Remove(target);
else target.Render(_decalMaterial, part.mpb, camera);
} }
} }
} }

View File

@ -1,3 +1,4 @@
using ConformalDecals.Util;
using UnityEngine; using UnityEngine;
namespace ConformalDecals { namespace ConformalDecals {
@ -38,7 +39,7 @@ namespace ConformalDecals {
if (HighLogic.LoadedSceneIsEditor) { if (HighLogic.LoadedSceneIsEditor) {
// Register flag change event // Register flag change event
GameEvents.onMissionFlagSelect.Add(OnEditorFlagSelected); GameEvents.onMissionFlagSelect.Add(OnEditorFlagSelected);
// Register reset button event // Register reset button event
Events[nameof(ResetFlag)].guiActiveEditor = useCustomFlag; Events[nameof(ResetFlag)].guiActiveEditor = useCustomFlag;
} }
@ -53,7 +54,7 @@ namespace ConformalDecals {
// Unregister flag change event // Unregister flag change event
GameEvents.onMissionFlagSelect.Remove(OnEditorFlagSelected); GameEvents.onMissionFlagSelect.Remove(OnEditorFlagSelected);
} }
base.OnDestroy(); base.OnDestroy();
} }
@ -62,7 +63,7 @@ namespace ConformalDecals {
// Button for selecting a flag // Button for selecting a flag
// This is a bit of a hack to bring up the stock flag selection menu // This is a bit of a hack to bring up the stock flag selection menu
// When its done, it calls OnCustomFlagSelected() // When its done, it calls OnCustomFlagSelected()
// ReSharper disable once PossibleNullReferenceException // ReSharper disable once PossibleNullReferenceException
var flagBrowser = (Instantiate((Object) (new FlagBrowserGUIButton(null, null, null, null)).FlagBrowserPrefab) as GameObject).GetComponent<FlagBrowser>(); var flagBrowser = (Instantiate((Object) (new FlagBrowserGUIButton(null, null, null, null)).FlagBrowserPrefab) as GameObject).GetComponent<FlagBrowser>();
flagBrowser.OnFlagSelected = OnCustomFlagSelected; flagBrowser.OnFlagSelected = OnCustomFlagSelected;
@ -70,24 +71,24 @@ namespace ConformalDecals {
[KSPEvent(guiActive = false, guiActiveEditor = true, guiName = "#LOC_ConformalDecals_gui-reset-flag")] [KSPEvent(guiActive = false, guiActiveEditor = true, guiName = "#LOC_ConformalDecals_gui-reset-flag")]
public void ResetFlag() { public void ResetFlag() {
// we are no longer using a custom flag, so instead use the mission or agency flag // we are no longer using a custom flag, so instead use the mission or agency flag
useCustomFlag = false; useCustomFlag = false;
flagUrl = "Mission"; flagUrl = "Mission";
UpdateFlag(true); UpdateFlag(true);
// disable the reset button, since it no longer makes sense // disable the reset button, since it no longer makes sense
Events[nameof(ResetFlag)].guiActiveEditor = false; Events[nameof(ResetFlag)].guiActiveEditor = false;
} }
private void OnCustomFlagSelected(FlagBrowser.FlagEntry newFlagEntry) { private void OnCustomFlagSelected(FlagBrowser.FlagEntry newFlagEntry) {
// Callback for when a flag is selected in the menu spawned by SelectFlag() // 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 // we are now using a custom flag with the URL of the new flag entry
useCustomFlag = true; useCustomFlag = true;
flagUrl = newFlagEntry.textureInfo.name; flagUrl = newFlagEntry.textureInfo.name;
UpdateFlag(true); UpdateFlag(true);
// make sure the reset button is now available // make sure the reset button is now available
Events[nameof(ResetFlag)].guiActiveEditor = true; Events[nameof(ResetFlag)].guiActiveEditor = true;
} }
@ -105,16 +106,18 @@ namespace ConformalDecals {
private void UpdateFlag(bool recursive = false) { private void UpdateFlag(bool recursive = false) {
// get the decal material property for the decal texture // get the decal material property for the decal texture
var textureProperty = materialProperties.AddOrGetTextureProperty("_Decal", true); var textureProperty = materialProperties.AddOrGetTextureProperty("_Decal", true);
if(useCustomFlag) { string textureURL = useCustomFlag ? flagUrl : MissionFlagUrl;
// set the texture to the custom flag textureProperty.TextureUrl = textureURL;
textureProperty.TextureUrl = flagUrl;
if (DecalConfig.AspectRatios.ContainsKey(textureURL)) {
var ratio = DecalConfig.AspectRatios[textureURL];
this.Log($"Overriding aspect ratio for {textureURL} with {ratio}");
textureProperty.AspectRatio = ratio;
} else {
textureProperty.AspectRatio = -1.0f;
} }
else {
// set the texture to the mission flag
textureProperty.TextureUrl = MissionFlagUrl;
}
UpdateMaterials(); UpdateMaterials();
UpdateScale(); UpdateScale();
@ -122,7 +125,7 @@ namespace ConformalDecals {
// for each symmetry counterpart, copy this part's properties and update it in turn // for each symmetry counterpart, copy this part's properties and update it in turn
foreach (var counterpart in part.symmetryCounterparts) { foreach (var counterpart in part.symmetryCounterparts) {
var decal = counterpart.GetComponent<ModuleConformalFlag>(); var decal = counterpart.GetComponent<ModuleConformalFlag>();
decal.useCustomFlag = useCustomFlag; decal.useCustomFlag = useCustomFlag;
decal.flagUrl = flagUrl; decal.flagUrl = flagUrl;
decal.UpdateFlag(); decal.UpdateFlag();

View File

@ -227,7 +227,7 @@ namespace ConformalDecals {
if (_textEntryController != null) _textEntryController.Close(); if (_textEntryController != null) _textEntryController.Close();
if (_fillColorPickerController != null) _fillColorPickerController.Close(); if (_fillColorPickerController != null) _fillColorPickerController.Close();
if (_outlineColorPickerController != null) _outlineColorPickerController.Close(); if (_outlineColorPickerController != null) _outlineColorPickerController.Close();
base.OnDestroy(); base.OnDestroy();
} }