You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
KSP-Conformal-Decals/Source/ConformalDecals/ProjectionPartTarget.cs

51 lines
1.9 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
namespace ConformalDecals {
public class ProjectionPartTarget : IProjectionTarget {
public readonly Part part;
public readonly List<ProjectionMeshTarget> meshTargets;
public ProjectionPartTarget(Part part, bool useBaseNormal) {
this.part = part;
meshTargets = new List<ProjectionMeshTarget>();
foreach (var renderer in part.FindModelComponents<MeshRenderer>()) {
var target = renderer.transform;
var filter = target.GetComponent<MeshFilter>();
// check if the target has any missing data
if (!ProjectionMeshTarget.ValidateTarget(target, renderer, filter)) continue;
// create new ProjectionTarget to represent the renderer
var projectionTarget = new ProjectionMeshTarget(target, part.transform, renderer, filter.sharedMesh, useBaseNormal);
// add the target to the list
meshTargets.Add(projectionTarget);
}
}
public void Project(Matrix4x4 orthoMatrix, Transform projector, Bounds projectionBounds) {
foreach (var meshTarget in meshTargets) {
meshTarget.Project(orthoMatrix, projector, projectionBounds);
}
}
public void Render(Material decalMaterial, MaterialPropertyBlock partMPB, Camera camera) {
foreach (var target in meshTargets) {
target.Render(decalMaterial, partMPB, camera);
}
}
public ConfigNode Save() {
var node = new ConfigNode("PART_TARGET");
node.AddValue("part", part.flightID);
foreach (var meshTarget in meshTargets) {
node.AddNode(meshTarget.Save());
}
return node;
}
}
}