Files
ichni_Official/Assets/Scripts/Game/GameElements/Track/TrackSubmodules/TrackRendererSubmodule.cs
SoulliesOfficial a635ec4221 GPU优化
2026-02-27 08:21:00 -05:00

401 lines
15 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using Dreamteck.Splines;
using Ichni.RhythmGame.Beatmap;
using UniRx;
using Unity.VisualScripting;
using UnityEngine;
using Object = UnityEngine.Object;
namespace Ichni.RhythmGame
{
public partial class TrackRendererSubmodule : TrackSubmodule
{
public MeshGenerator meshGenerator;
public MeshRenderer meshRenderer;
public Material renderMaterial;
public string materialThemeBundleName;
public string materialName;
public bool enableEmission;
public float emissionIntensity;
public bool zWrite;
public Vector2 uvScale;
public Vector2 uvOffset;
public TrackRendererSubmodule(Track track, bool enableEmission, float emissionIntensity, bool zWrite,
Vector2 uvScale, Vector2 uvOffset) : base(track)
{
this.enableEmission = enableEmission;
this.emissionIntensity = emissionIntensity;
this.materialThemeBundleName = String.Empty;
this.materialName = String.Empty;
this.zWrite = zWrite;
this.uvScale = uvScale;
this.uvOffset = uvOffset;
if (!HaveSameSubmodule)
{
this.track.trackRendererSubmodule = this;
}
}
public void ApplyMaterial(string materialThemeBundleName, string materialName)
{
this.materialThemeBundleName = materialThemeBundleName;
this.materialName = materialName;
Material mat = ThemeBundleManager.instance.GetObject<Material>(materialThemeBundleName, materialName);
if(mat != null)
{
renderMaterial = mat;
meshRenderer.material = renderMaterial;
}
meshRenderer.InitializeShader();
}
public override void Refresh()
{
SetEnableZWrite();
SetEnableEmission();
SetEmissionIntensity();
SetUV();
}
protected void SetMesh()
{
this.meshGenerator.enabled = false;
if (track.trackTimeSubmodule is TrackTimeSubmoduleMovable trackTimeSubmoduleMovable)
{
meshGenerator.clipFrom = trackTimeSubmoduleMovable.tailPercent;
meshGenerator.clipTo = trackTimeSubmoduleMovable.headPercent;
}
else
{
meshGenerator.clipFrom = 0;
meshGenerator.clipTo = 1;
}
}
public override void SaveBM()
{
throw new System.NotImplementedException();
}
}
public partial class TrackRendererSubmodule
{
protected void SetEnableEmission()
{
meshRenderer.material.SetInt("_Emission", enableEmission ? 1 : 0);
}
protected void SetEnableZWrite()
{
meshRenderer.material.SetInt("_ZWrite", zWrite ? 1 : 0);
}
protected void SetEmissionIntensity()
{
meshRenderer.material.SetColor("_EmissionColor", Color.white * Mathf.Pow(2, emissionIntensity));
}
protected void SetUV()
{
meshGenerator.uvScale = uvScale;
meshGenerator.uvOffset = uvOffset;
}
}
#region AutoOrient
public class TrackRendererSubmoduleAutoOrient : TrackRendererSubmodule
{
public SplineRenderer splineRenderer;
public TrackRendererSubmoduleAutoOrient(Track track, bool enableEmission, float emissionIntensity,
bool zWrite, Vector2 uvScale, Vector2 uvOffset, Material material = null) :
base(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset)
{
this.splineRenderer = track.AddComponent<SplineRenderer>();
this.meshRenderer = splineRenderer.GetComponent<MeshRenderer>();
this.meshGenerator = splineRenderer;
this.renderMaterial = material == null ? GameManager.instance.basePrefabs.defaultTrackMaterial : material;
this.splineRenderer.spline = track.trackPathSubmodule.path;
this.splineRenderer.clipFrom = 0;
this.splineRenderer.clipTo = 1;
this.splineRenderer.updateMethod = SplineUser.UpdateMethod.Update;
this.meshRenderer.material = renderMaterial;
this.splineRenderer.color = Color.white;
this.splineRenderer.uvRotation = 90;
this.splineRenderer.uvMode = MeshGenerator.UVMode.UniformClip;
SetMesh();
}
public override void SaveBM()
{
matchedBM = new TrackRendererSubmoduleAutoOrient_BM(attachedGameElement, this);
}
}
namespace Beatmap
{
public class TrackRendererSubmoduleAutoOrient_BM : Submodule_BM
{
public string materialThemeBundleName;
public string materialName;
public bool enableEmission;
public float emissionIntensity;
public bool zWrite;
public Vector2 uvScale = Vector2.one;
public Vector2 uvOffset = Vector2.zero;
public TrackRendererSubmoduleAutoOrient_BM()
{
}
public TrackRendererSubmoduleAutoOrient_BM(GameElement attachedElement,
TrackRendererSubmoduleAutoOrient trackRendererSubmodule) : base(attachedElement)
{
materialThemeBundleName = trackRendererSubmodule.materialThemeBundleName;
materialName = trackRendererSubmodule.materialName;
enableEmission = trackRendererSubmodule.enableEmission;
emissionIntensity = trackRendererSubmodule.emissionIntensity;
}
public override void ExecuteBM()
{
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackRendererSubmodule = new TrackRendererSubmoduleAutoOrient(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
if (materialName.Trim() != String.Empty)
{
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
}
}
}
}
#endregion
#region PathGenerator
public class TrackRendererSubmodulePathGenerator : TrackRendererSubmodule
{
public PathGenerator pathGenerator;
public TrackRendererSubmodulePathGenerator(Track track, bool enableEmission, float emissionIntensity,
bool zWrite, Vector2 uvScale, Vector2 uvOffset, Material material = null) :
base(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset)
{
this.pathGenerator = track.AddComponent<PathGenerator>();
this.meshRenderer = pathGenerator.GetComponent<MeshRenderer>();
this.meshGenerator = pathGenerator;
this.renderMaterial = material == null ? GameManager.instance.basePrefabs.defaultTrackMaterial : material;
this.pathGenerator.spline = track.trackPathSubmodule.path;
this.pathGenerator.clipFrom = 0;
this.pathGenerator.clipTo = 1;
this.pathGenerator.updateMethod = SplineUser.UpdateMethod.Update;
this.meshRenderer.material = renderMaterial;
this.pathGenerator.color = Color.white;
this.pathGenerator.uvRotation = 90;
this.pathGenerator.uvMode = MeshGenerator.UVMode.UniformClip;
SetMesh();
}
public override void SaveBM()
{
matchedBM = new TrackRendererSubmodulePathGenerator_BM(attachedGameElement, this);
}
}
namespace Beatmap
{
public class TrackRendererSubmodulePathGenerator_BM : Submodule_BM
{
public string materialThemeBundleName;
public string materialName;
public bool enableEmission;
public float emissionIntensity;
public bool zWrite;
public Vector2 uvScale = Vector2.one;
public Vector2 uvOffset = Vector2.zero;
public TrackRendererSubmodulePathGenerator_BM()
{
}
public TrackRendererSubmodulePathGenerator_BM(GameElement attachedElement,
TrackRendererSubmodulePathGenerator trackRendererSubmodule) : base(attachedElement)
{
materialThemeBundleName = trackRendererSubmodule.materialThemeBundleName;
materialName = trackRendererSubmodule.materialName;
enableEmission = trackRendererSubmodule.enableEmission;
emissionIntensity = trackRendererSubmodule.emissionIntensity;
}
public override void ExecuteBM()
{
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackRendererSubmodule = new TrackRendererSubmodulePathGenerator(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
if (materialName.Trim() != String.Empty)
{
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
}
}
}
}
#endregion
#region TubeGenerator
public class TrackRendererSubmoduleTubeGenerator : TrackRendererSubmodule
{
public TubeGenerator tubeGenerator;
public int sideCount;
public TrackRendererSubmoduleTubeGenerator(Track track, bool enableEmission, float emissionIntensity,
bool zWrite, int sideCount, Vector2 uvScale, Vector2 uvOffset, Material material = null) :
base(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset)
{
this.sideCount = sideCount;
this.tubeGenerator = track.AddComponent<TubeGenerator>();
this.meshRenderer = tubeGenerator.GetComponent<MeshRenderer>();
this.meshGenerator = tubeGenerator;
this.renderMaterial = material == null ? GameManager.instance.basePrefabs.defaultTrackMaterial : material;
this.tubeGenerator.spline = track.trackPathSubmodule.path;
this.tubeGenerator.clipFrom = 0;
this.tubeGenerator.clipTo = 1;
this.tubeGenerator.updateMethod = SplineUser.UpdateMethod.Update;
this.meshRenderer.material = renderMaterial;
this.tubeGenerator.color = Color.white;
this.tubeGenerator.uvRotation = 90;
this.tubeGenerator.sides = sideCount;
this.tubeGenerator.uvMode = MeshGenerator.UVMode.UniformClip;
SetMesh();
}
public override void SaveBM()
{
matchedBM = new TrackRendererSubmoduleTubeGenerator_BM(attachedGameElement, this);
}
}
namespace Beatmap
{
public class TrackRendererSubmoduleTubeGenerator_BM : Submodule_BM
{
public string materialThemeBundleName;
public string materialName;
public bool enableEmission;
public float emissionIntensity;
public bool zWrite;
public int sideCount;
public Vector2 uvScale = Vector2.one;
public Vector2 uvOffset = Vector2.zero;
public TrackRendererSubmoduleTubeGenerator_BM()
{
}
public TrackRendererSubmoduleTubeGenerator_BM(GameElement attachedElement,
TrackRendererSubmoduleTubeGenerator trackRendererSubmodule) : base(attachedElement)
{
materialThemeBundleName = trackRendererSubmodule.materialThemeBundleName;
materialName = trackRendererSubmodule.materialName;
enableEmission = trackRendererSubmodule.enableEmission;
emissionIntensity = trackRendererSubmodule.emissionIntensity;
sideCount = trackRendererSubmodule.sideCount;
}
public override void ExecuteBM()
{
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackRendererSubmodule = new TrackRendererSubmoduleTubeGenerator(track, enableEmission, emissionIntensity, zWrite, sideCount, uvScale, uvOffset);
if (materialName.Trim() != String.Empty)
{
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
}
}
}
}
#endregion
#region Surface
public class TrackRendererSubmoduleSurface : TrackRendererSubmodule
{
public SurfaceGenerator surface;
public TrackRendererSubmoduleSurface(Track track, bool enableEmission, float emissionIntensity,
bool zWrite, Vector2 uvScale, Vector2 uvOffset, Material material = null) :
base(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset)
{
this.surface = track.AddComponent<SurfaceGenerator>();
this.meshRenderer = surface.GetComponent<MeshRenderer>();
this.meshGenerator = surface;
this.renderMaterial = material == null ? GameManager.instance.basePrefabs.defaultTrackMaterial : material;
this.surface.spline = track.trackPathSubmodule.path;
this.surface.clipFrom = 0;
this.surface.clipTo = 1;
this.surface.updateMethod = SplineUser.UpdateMethod.Update;
this.meshRenderer.material = renderMaterial;
this.surface.color = Color.white;
this.surface.uvRotation = 90;
this.surface.uvMode = MeshGenerator.UVMode.UniformClip;
SetMesh();
}
public override void SaveBM()
{
matchedBM = new TrackRendererSubmoduleSurface_BM(attachedGameElement, this);
}
}
namespace Beatmap
{
public class TrackRendererSubmoduleSurface_BM : Submodule_BM
{
public string materialThemeBundleName;
public string materialName;
public bool enableEmission;
public float emissionIntensity;
public bool zWrite;
public Vector2 uvScale = Vector2.one;
public Vector2 uvOffset = Vector2.zero;
public TrackRendererSubmoduleSurface_BM()
{
}
public TrackRendererSubmoduleSurface_BM(GameElement attachedElement,
TrackRendererSubmoduleSurface trackRendererSubmodule) : base(attachedElement)
{
materialThemeBundleName = trackRendererSubmodule.materialThemeBundleName;
materialName = trackRendererSubmodule.materialName;
enableEmission = trackRendererSubmodule.enableEmission;
emissionIntensity = trackRendererSubmodule.emissionIntensity;
}
public override void ExecuteBM()
{
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackRendererSubmodule = new TrackRendererSubmoduleSurface(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
if (materialName.Trim() != String.Empty)
{
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
}
}
}
}
#endregion
}