94 lines
3.1 KiB
C#
94 lines
3.1 KiB
C#
using System;
|
|
using Dreamteck.Splines;
|
|
using Ichni.RhythmGame.Beatmap;
|
|
using UnityEngine;
|
|
|
|
namespace Ichni.RhythmGame
|
|
{
|
|
public abstract class TrackRendererSubmodule : TrackSubmodule
|
|
{
|
|
#region [暴露属性字段] Fields
|
|
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;
|
|
#endregion
|
|
|
|
#region [初始化与防御机制] Initialization & Defense
|
|
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;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region [材质与网格控制] Material & Mesh Control
|
|
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()
|
|
{
|
|
if (track.trackTimeSubmodule is TrackTimeSubmoduleMovable trackTimeSubmoduleMovable)
|
|
{
|
|
meshGenerator.clipFrom = trackTimeSubmoduleMovable.tailPercent;
|
|
meshGenerator.clipTo = trackTimeSubmoduleMovable.headPercent;
|
|
}
|
|
else
|
|
{
|
|
meshGenerator.clipFrom = 0;
|
|
meshGenerator.clipTo = 1;
|
|
}
|
|
}
|
|
|
|
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()
|
|
{
|
|
if (meshGenerator != null)
|
|
{
|
|
meshGenerator.uvScale = uvScale;
|
|
meshGenerator.uvOffset = uvOffset;
|
|
}
|
|
}
|
|
#endregion
|
|
}
|
|
}
|