unity/Assets/Scripts/Components/Hide.cs (86 lines of code) (raw):
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// The Hide component allows to prevent some objects from being rendered. Three
// types of entities are supported: bodies (with subobjects), geoms and sites.
// For each entity type a list of prefixes can be provided, if an entity name
// matches a prefix the entity will be hidden.
//
// Configurable properties:
// string body_prefix - a comma separated list of prefixes, bodies to be hidden,
// string geom_prefix - a comma separated list of prefixes, geoms to be hidden,
// string site_prefix - a comma separated list of prefixes, sites to be hidden.
public class Hide : RendererComponent {
[SerializeField]
[ConfigProperty]
public string body_prefix_ = "";
[SerializeField]
[ConfigProperty]
public string geom_prefix_ = "";
[SerializeField]
[ConfigProperty]
public string site_prefix_ = "";
private List<BodyController> bodies_ = new List<BodyController>();
private List<GeomController> geoms_ = new List<GeomController>();
private List<SiteController> sites_ = new List<SiteController>();
// Unhide the hidden objects, clear the lists.
private void Clear() {
foreach (BodyController body in bodies_) {
body.gameObject.SetActive(true);
}
bodies_.Clear();
foreach (GeomController geom in geoms_) {
geom.gameObject.SetActive(true);
}
geoms_.Clear();
foreach (SiteController site in sites_) {
site.gameObject.SetActive(true);
}
sites_.Clear();
}
public override bool UpdateComponent(Orrb.RendererComponentConfig config) {
base.UpdateComponent(config);
Clear();
HideBodies();
HideGeoms();
HideSites();
return true;
}
// Hide bodies and keep a list of hidden ones.
private void HideBodies() {
string[] prefixes = body_prefix_.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (BodyController body in transform.GetComponentsInChildren<BodyController>()) {
foreach (string prefix in prefixes) {
if (body.name.StartsWith(prefix, StringComparison.Ordinal)) {
bodies_.Add(body);
body.gameObject.SetActive(false);
break;
}
}
}
}
// Hide geoms and keep a list of hidden ones.
private void HideGeoms() {
string[] prefixes = geom_prefix_.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (GeomController geom in transform.GetComponentsInChildren<GeomController>()) {
foreach (string prefix in prefixes) {
if (geom.name.StartsWith(prefix, StringComparison.Ordinal)) {
geoms_.Add(geom);
geom.gameObject.SetActive(false);
break;
}
}
}
}
// Hide sites and keep a list of hidden ones.
private void HideSites() {
string[] prefixes = site_prefix_.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (SiteController site in transform.GetComponentsInChildren<SiteController>()) {
foreach (string prefix in prefixes) {
if (site.name.StartsWith(prefix, StringComparison.Ordinal)) {
sites_.Add(site);
site.gameObject.SetActive(false);
break;
}
}
}
}
// This component does nothing each frame. The actual hiding happens on initialization / update.
public override bool RunComponent(RendererComponent.IOutputContext context) {
return true;
}
public override void DrawEditorGUI() {
GUILayout.BeginVertical();
RendererComponent.GUIField("body_prefix", ref body_prefix_);
RendererComponent.GUIField("geom_prefix", ref geom_prefix_);
RendererComponent.GUIField("site_prefix", ref site_prefix_);
GUILayout.EndVertical();
}
}