The missile knows where it is at all times. It knows this because it knows where it isn't. By subtracting where it is from where it isn't, or where it isn't from where it is (whichever is greater), it obtains a difference, or deviation. The guidance subsystem uses deviations to generate corrective commands to drive the missile from a position where it is to a position where it isn't, and arriving at a position where it wasn't, it now is. Consequently, the position where it is, is now the position that it wasn't, and it follows that the position that it was, is now the position that it isn't.

In the event that the position that it is in is not the position that it wasn't, the system has acquired a variation, the variation being the difference between where the missile is, and where it wasn't. If variation is considered to be a significant factor, it too may be corrected by the GEA. However, the missile must also know where it was.
The missile guidance computer scenario works as follows. Because a variation has modified some of the information the missile has obtained, it is not sure just where it is. However, it is sure where it isn't, within reason, and it knows where it was. It now subtracts where it should be from where it wasn't, or vice-versa, and by differentiating this from the algebraic sum of where it shouldn't be, and where it was, it is able to obtain the deviation and its variation, which is called error.
This commit is contained in:
Tim
2025-07-09 01:49:02 +02:00
parent 5853d74435
commit bf8257cb14
8 changed files with 213 additions and 130 deletions

View File

@@ -5,20 +5,28 @@ using UnityEngine;
// Data definition of ChildModel // Data definition of ChildModel
public class ChildModel : Model public class ChildModel : Model
{ {
public string Port { get; private set; } public string ParentPort { get; private set; }
public ChildModel(string port, string nameHuman, string nameId, Mesh mesh, Material material, Vector3 offset, public ChildModel(string parentPort, string nameHuman, string nameId, Mesh mesh, Material material, Vector3 offset,
Quaternion rotation, Vector3 scale, List<Port> ports = null, List<Color> colors = null) Quaternion rotation, Vector3 scale, List<Port> ports = null, List<Color> colors = null, bool passthrough = false)
: base(nameHuman, nameId, mesh, material, offset, rotation, scale, ports, colors) : base(nameHuman, nameId, mesh, material, offset, rotation, scale, ports, colors, passthrough)
{ {
this.Port = port; this.ParentPort = parentPort;
} }
public ChildModel(string port, string nameHuman, string nameId, Mesh mesh, public ChildModel(string parentPort, string nameHuman, string nameId, Mesh mesh,
Material material, List<Port> ports = null, List<Color> color = null) Material material, List<Port> ports = null, List<Color> color = null, bool passthrough = false)
: base(nameHuman, nameId, mesh, material, ports, color) : base(nameHuman, nameId, mesh, material, ports, color, passthrough)
{ {
this.Port = port; this.ParentPort = parentPort;
}
// For Groups, no Mesh
public ChildModel(string parentPort, string nameHuman, string nameId, Material material, Vector3 offset,
Quaternion rotation, Vector3 scale, List<Port> ports = null, List<Color> colors = null, bool passthrough = false)
: base(nameHuman, nameId, new Mesh(), material, offset, rotation, scale, ports, colors, passthrough)
{
this.ParentPort = parentPort;
} }
} }

View File

@@ -1,4 +1,5 @@
using System; using System;
using UnityEngine;
public class ChildModelBehaviour : ModelBehaviour public class ChildModelBehaviour : ModelBehaviour
{ {
@@ -21,5 +22,21 @@ public class ChildModelBehaviour : ModelBehaviour
Model = value; Model = value;
} }
} }
public ModelBehaviour Parent { get; set; }
public Port GetParentPort()
{
Debug.Log($"Searching port for {name} with PortID {ChildModel.ParentPort} with parent {Parent}");
foreach (Port parentPort in Parent.Model.Ports)
{
if (parentPort.PortID == ChildModel.ParentPort)
{
Debug.Log($"Found port for {name} with PortID {parentPort.PortID} {parentPort.PortName} for {ChildModel.ParentPort}");
return parentPort;
}
}
Debug.LogWarning($"Didn't find port for {name} with PortID {ChildModel.ParentPort}");
return null;
}
} }

View File

@@ -96,14 +96,15 @@ public class Definitions
public const string PORT_ERLBACH_77 = "portErlbach77"; public const string PORT_ERLBACH_77 = "portErlbach77";
public const string PORT_ERLBACH_78 = "portErlbach78"; public const string PORT_ERLBACH_78 = "portErlbach78";
public const string PORT_ERLBACH_79 = "portErlbach79"; public const string PORT_ERLBACH_79 = "portErlbach79";
public const string PORT_ERL_RIM_LH = "erlRimLH"; public const string PORT_ERL_RIMS = "erlRims";
public const string PORT_ERL_RIM_LV = "erlRimLV"; public const string PORT_ERL_RIM_LH = "erlRimLinksHinten";
public const string PORT_ERL_RIM_RV = "erlRimRV"; public const string PORT_ERL_RIM_LV = "erlRimLinksVorne";
public const string PORT_ERL_RIM_RH = "erlRimRH"; public const string PORT_ERL_RIM_RV = "erlRimRechtsVorne";
public const string PORT_ERL_TIRE_LH = "erlTire"; public const string PORT_ERL_RIM_RH = "erlRimRechtsHinten";
public const string PORT_ERL_TIRE_LV = "tire1"; public const string PORT_ERL_TIRE_LH = "erlTireLinksHinten";
public const string PORT_ERL_TIRE_RH = "tire2"; public const string PORT_ERL_TIRE_LV = "erlTireLinksVorne";
public const string PORT_ERL_TIRE_RV = "tire3"; public const string PORT_ERL_TIRE_RV = "erlTireRechtsVorne";
public const string PORT_ERL_TIRE_RH = "erlTireRechtsHinten";
public const string PORT_ERLBACH_Body = "body"; public const string PORT_ERLBACH_Body = "body";
public const string PORT_ERLBACH_Bumper = "portErlbach85"; public const string PORT_ERLBACH_Bumper = "portErlbach85";
public const string PORT_ERLBACH_FrontBumper = "portErlbach86"; public const string PORT_ERLBACH_FrontBumper = "portErlbach86";

View File

@@ -9,6 +9,7 @@ public class Model
public Material Material { get; internal set; } // skin public Material Material { get; internal set; } // skin
public List<Color> Color { get; set; } // koleur public List<Color> Color { get; set; } // koleur
public readonly bool Passthrough; //whether this passes through color
public readonly List<Port> Ports; public readonly List<Port> Ports;
@@ -17,7 +18,7 @@ public class Model
public readonly Vector3 Scale; public readonly Vector3 Scale;
public Model(string nameHuman, string nameId, Mesh mesh, Material material, Vector3 offset, public Model(string nameHuman, string nameId, Mesh mesh, Material material, Vector3 offset,
Quaternion rotation, Vector3 scale, List<Port> ports = null, List<Color> color = null) Quaternion rotation, Vector3 scale, List<Port> ports = null, List<Color> color = null, bool passthrough = false)
{ {
this.NameHuman = nameHuman; this.NameHuman = nameHuman;
this.NameId = nameId; this.NameId = nameId;
@@ -28,8 +29,9 @@ public class Model
this.Rotation = rotation; this.Rotation = rotation;
this.Scale = scale; this.Scale = scale;
this.Color = color; this.Color = color;
this.Passthrough = passthrough;
} }
public Model(string nameHuman, string nameId, Mesh mesh, Material material, List<Port> ports = null, List<Color> color = null) public Model(string nameHuman, string nameId, Mesh mesh, Material material, List<Port> ports = null, List<Color> color = null, bool passthrough = false)
{ {
this.NameHuman = nameHuman; this.NameHuman = nameHuman;
this.NameId = nameId; this.NameId = nameId;
@@ -40,6 +42,7 @@ public class Model
this.Rotation = Quaternion.identity; this.Rotation = Quaternion.identity;
this.Scale = Vector3.one; this.Scale = Vector3.one;
this.Color = color; this.Color = color;
this.Passthrough = passthrough;
} }
public bool HasColor() public bool HasColor()
@@ -52,9 +55,4 @@ public class Model
return Ports != null && Ports.Count > 0; return Ports != null && Ports.Count > 0;
} }
public void AddPort(Port port)
{
Ports.Add(port);
}
} }

View File

@@ -5,7 +5,7 @@ using UnityEngine;
/// <summary> /// <summary>
/// Base for BaseModelBehaviour and ChildModelBehaviour /// Base for BaseModelBehaviour and ChildModelBehaviour
/// </summary> /// </summary>
public class ModelBehaviour : MonoBehaviour public class ModelBehaviour : MonoBehaviour, IResettable
{ {
public ModelManager ModelManager; public ModelManager ModelManager;
private Model _model; private Model _model;
@@ -22,11 +22,35 @@ public class ModelBehaviour : MonoBehaviour
_model = value; _model = value;
} }
} //should be verified } //should be verified
private readonly List<GameObject> _children = new List<GameObject>(); readonly List<GameObject> _children = new List<GameObject>();
private MeshFilter _meshFilter; MeshFilter _meshFilter;
private MeshRenderer _meshRenderer; MeshRenderer _meshRenderer;
private Color Color = Color.black; Color _color = Color.black;
Color Color
{
get
{
return _color;
}
set
{
var clonedMaterial = new Material(_meshRenderer.material); //clone da sonst alle anderen mit dem mat auch colorchanged werden
clonedMaterial.color = value;
_meshRenderer.material = clonedMaterial;
Debug.Log($"{name}: Set color from {_color} to {value}");
_color = value;
if (Model.Passthrough)
{
Debug.Log($"{name}: Passthrough {_children.Count}");
foreach (GameObject go in _children)
{
Debug.Log($"{name}: coloring {go.name}");
go.GetComponent<ChildModelBehaviour>().Color = value;
}
}
}
}
void Start() void Start()
{ {
@@ -45,26 +69,26 @@ public class ModelBehaviour : MonoBehaviour
void UpdateModel(Model newModel) void UpdateModel(Model newModel)
{ {
Debug.Log($"UpdateModel: {name} updates from {(Model == null ? "null" : Model.NameId)} to {newModel.NameId}");
Init(); // I love race conditions Init(); // I love race conditions
if (newModel is BaseModel) if (newModel is BaseModel)
{ {
this.name = "BaseModel:" + newModel.NameId; name = "BaseModel:" + newModel.NameId;
} }
else if (newModel is ChildModel cModel) else if (newModel is ChildModel cModel)
{ {
this.name = cModel.Port + ":" + newModel.NameId; Debug.Log($"UpdateModel Name: {name} to {cModel.ParentPort}:{newModel.NameId}");
name = cModel.ParentPort + ":" + newModel.NameId;
} }
//unapply previous model offset //unapply previous model offset
if (Model != null) if (Model != null)
{ {
Debug.Log($"Model {name} reset old {Model} offsets."); Debug.Log($"UpdateModel: Model {name} reset old {Model} offsets.");
transform.localPosition -= Model.Offset; transform.localPosition -= Model.Offset;
transform.localRotation *= Quaternion.Inverse(Model.Rotation); transform.localRotation *= Quaternion.Inverse(Model.Rotation);
transform.localScale -= Model.Scale; transform.localScale -= Model.Scale;
} }
Debug.Log($"Model {name} update to new {newModel} Model.");
//kill old children //kill old children
foreach (var compo in GetComponentsInChildren<ChildModelBehaviour>()) foreach (var compo in GetComponentsInChildren<ChildModelBehaviour>())
{ {
@@ -72,15 +96,9 @@ public class ModelBehaviour : MonoBehaviour
{ {
continue; continue;
} }
Debug.Log($"Destroying {name}'s Child {compo.gameObject.name}"); Debug.Log($"UpdateModel: Destroying {name}'s Child {compo.gameObject.name}");
Destroy(compo.gameObject); // will be destroyed next frame Destroy(compo.gameObject); // will be destroyed next frame
} _children.Remove(compo.gameObject);
//spawn new childPorts
if (newModel.HasPorts())
{
Debug.Log($"Spawning {gameObject.name}'s ports");
SpawnChildPorts(newModel);
} }
//change ourselves //change ourselves
_meshFilter.mesh = newModel.Mesh; _meshFilter.mesh = newModel.Mesh;
@@ -90,6 +108,13 @@ public class ModelBehaviour : MonoBehaviour
transform.localRotation = newModel.Rotation; transform.localRotation = newModel.Rotation;
transform.localScale = newModel.Scale; transform.localScale = newModel.Scale;
transform.localPosition += newModel.Offset; transform.localPosition += newModel.Offset;
//spawn new childPorts
if (newModel.HasPorts())
{
Debug.Log($"Spawning {gameObject.name}'s ports");
SpawnChildPorts(newModel);
}
} }
public void UpdateChild(int childNum, string id) public void UpdateChild(int childNum, string id)
@@ -100,7 +125,9 @@ public class ModelBehaviour : MonoBehaviour
} }
Model.Ports[childNum].Unapply(_children[childNum].transform); Model.Ports[childNum].Unapply(_children[childNum].transform);
//set new //set new
_children[childNum].GetComponent<ChildModelBehaviour>().ChildModel = ModelManager.GetById(id); var cmb = _children[childNum].GetComponent<ChildModelBehaviour>();
cmb.ChildModel = ModelManager.GetById(id);
cmb.Parent = this;
Model.Ports[childNum].Apply(_children[childNum].transform); Model.Ports[childNum].Apply(_children[childNum].transform);
} }
@@ -108,9 +135,9 @@ public class ModelBehaviour : MonoBehaviour
/// Spawns all Port-GO's, should be called only on Model Switch <b>after</b> cleanup /// Spawns all Port-GO's, should be called only on Model Switch <b>after</b> cleanup
/// </summary> /// </summary>
/// <param name="newModel"><c>Model</c> the New Model to spawn ports from</param> /// <param name="newModel"><c>Model</c> the New Model to spawn ports from</param>
private void SpawnChildPorts(Model newModel) void SpawnChildPorts(Model newModel)
{ {
Debug.Log($"{newModel.NameId}: Spawning {this.name} count of {newModel.Ports.Count} Ports"); Debug.Log($"SpawnChildPorts: {name} : {newModel.NameId} spawns {newModel.Ports.Count} Ports");
if (ModelManager == null) if (ModelManager == null)
{ {
Debug.LogError("ModelManager not found"); Debug.LogError("ModelManager not found");
@@ -121,8 +148,8 @@ public class ModelBehaviour : MonoBehaviour
{ {
var port = newModel.Ports[i]; var port = newModel.Ports[i];
Debug.Log(i + ". Creating port " + port.PortID); Debug.Log(i + ". Creating port " + port.PortID);
// bike:wheel:num // name is set in UpdateModel of own model
GameObject child = new GameObject(this.name + ":" + port.PortID + ":" + i); GameObject child = new GameObject("unattended child");
child.transform.SetParent(this.transform); //makes this an actual child child.transform.SetParent(this.transform); //makes this an actual child
child.transform.localPosition = Vector3.zero; //i love unity child.transform.localPosition = Vector3.zero; //i love unity
ChildModelBehaviour cmb = child.AddComponent<ChildModelBehaviour>(); ChildModelBehaviour cmb = child.AddComponent<ChildModelBehaviour>();
@@ -136,9 +163,12 @@ public class ModelBehaviour : MonoBehaviour
continue; continue;
} }
Debug.Log($"POS {child.transform.gameObject.name} pos {child.transform.localPosition} {child.transform.rotation} {child.transform.localScale}"); Debug.Log($"SET POS {child.transform.gameObject.name} pos {child.transform.localPosition} {child.transform.rotation} {child.transform.localScale}");
cmb.Parent = this;
cmb.ChildModel = childModel; cmb.ChildModel = childModel;
Debug.Log($"AFTER SET PRE PORT POS {child.transform.gameObject.name} pos {child.transform.localPosition} {child.transform.rotation} {child.transform.localScale}");
port.Apply(child.transform); // move to correct position port.Apply(child.transform); // move to correct position
Debug.Log($"AFTER PORT POS {child.transform.gameObject.name} pos {child.transform.localPosition} {child.transform.rotation} {child.transform.localScale}");
} }
} }
@@ -159,7 +189,7 @@ public class ModelBehaviour : MonoBehaviour
export += $"\"modelId\": \"{Model.NameId}\""; export += $"\"modelId\": \"{Model.NameId}\"";
if(Model is ChildModel cm) if(Model is ChildModel cm)
{ {
export += $", \"portId\": \"{cm.Port}\""; export += $", \"portId\": \"{cm.ParentPort}\"";
} }
if (Model.HasColor()) if (Model.HasColor())
{ {
@@ -203,24 +233,11 @@ public class ModelBehaviour : MonoBehaviour
Debug.LogWarning($"PortIndex {portIndex} invalid: there are {_children.Count} children."); Debug.LogWarning($"PortIndex {portIndex} invalid: there are {_children.Count} children.");
return; return;
} }
_children[portIndex].GetComponent<ChildModelBehaviour>().Color = color;
var child = _children[portIndex];
var meshRenderer = child.GetComponent<MeshRenderer>();
child.GetComponent<ModelBehaviour>().Color = color;
if (meshRenderer == null)
{
Debug.LogWarning($"MeshRenderer for {portIndex} is null, skipping color set");
return;
}
// Klonen des Materials und Setzen der Farbe
var clonedMaterial = new Material(meshRenderer.material);
clonedMaterial.color = color;
meshRenderer.material = clonedMaterial; // Setzt den MeshRenderer auf den Klon
Debug.Log($"PortNum {portIndex}: Cloned Material and Set color to {color}");
} }
public void ClearChildren() public void ClearChildren()
{ {
Debug.Log("Removing Children..."); Debug.Log($"Removing Children of {name}...");
foreach (var child in _children) foreach (var child in _children)
{ {
if (child != null) if (child != null)
@@ -232,4 +249,9 @@ public class ModelBehaviour : MonoBehaviour
Debug.Log("Removed."); Debug.Log("Removed.");
} }
public void ResetThis()
{
Debug.Log($"Resetting {name}...");
ClearChildren();
}
} }

View File

@@ -137,14 +137,11 @@ public class ModelList
Port.Hidden(Definitions.PORT_ERLBACH_77, "idErlbachPart77", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, 0f, 30f)), Port.Hidden(Definitions.PORT_ERLBACH_77, "idErlbachPart77", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, 0f, 30f)),
Port.Hidden(Definitions.PORT_ERLBACH_78, "idErlbachPart78", Vector3.zero), Port.Hidden(Definitions.PORT_ERLBACH_78, "idErlbachPart78", Vector3.zero),
Port.Hidden(Definitions.PORT_ERLBACH_79, "idErlbachPart79", Vector3.zero), Port.Hidden(Definitions.PORT_ERLBACH_79, "idErlbachPart79", Vector3.zero),
Port.Hidden(Definitions.PORT_ERL_TIRE_LH, "LH", new Vector3(0f,0f,0f), Quaternion.identity, 1f, new Vector3(0f, -30f, 0f)), Port.Hidden(Definitions.PORT_ERL_TIRE_LH, "erlTire1_LH", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, -30f, 0f)),
Port.Choosable("Back Wheel Right", Definitions.PORT_ERL_RIM_LH, "idErlbachWheel_LH", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, -30f, 0f)), Port.Hidden(Definitions.PORT_ERL_TIRE_LV, "erlTire1_LV", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, -30f, 0f)),
Port.Hidden(Definitions.PORT_ERL_TIRE_LV, "LV", new Vector3(0f,0f,0f), Quaternion.identity, 1f, new Vector3(0f, -30f, 0f)), Port.Hidden(Definitions.PORT_ERL_TIRE_RH, "erlTire1_RH", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, 30f, 0f)),
Port.Choosable("Front Wheel Right", Definitions.PORT_ERL_RIM_LV, "idErlbachWheel_LV", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, -30f, 0f)), Port.Hidden(Definitions.PORT_ERL_TIRE_RV, "erlTire1_RV", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, 30f, 0f)),
Port.Hidden(Definitions.PORT_ERL_TIRE_RH, "RH", new Vector3(0f,0f,0f), Quaternion.identity, 1f, new Vector3(0f, 30f, 0f)), Port.Choosable("Rims", Definitions.PORT_ERL_RIMS, "erlRims_1", Vector3.zero, Quaternion.identity, 1f),
Port.Choosable("Back Wheel Left", Definitions.PORT_ERL_RIM_RH, "idErlbachWheel_RH", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, 30f, 0f)),
Port.Hidden(Definitions.PORT_ERL_TIRE_RV, "RV", new Vector3(0f,0f,0f), Quaternion.identity, 1f, new Vector3(0f, 30f, 0f)),
Port.Choosable("Front Wheel Left", Definitions.PORT_ERL_RIM_RV, "idErlbachWheel_RV", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, 30f, 0f)),
Port.Choosable("Body", Definitions.PORT_ERLBACH_Body, "idErlbachPart84", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, 0f, 100f)), Port.Choosable("Body", Definitions.PORT_ERLBACH_Body, "idErlbachPart84", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, 0f, 100f)),
Port.Choosable("Rear Bumper", Definitions.PORT_ERLBACH_Bumper, "idErlbachPart85", Vector3.zero, Quaternion.identity, 1f, new Vector3(20f, 0f, 0f)), Port.Choosable("Rear Bumper", Definitions.PORT_ERLBACH_Bumper, "idErlbachPart85", Vector3.zero, Quaternion.identity, 1f, new Vector3(20f, 0f, 0f)),
Port.Hidden(Definitions.PORT_ERLBACH_Headlight_V_Cover, "idErlbachPart86", new Vector3(2.1f, 0f, 0f), Quaternion.identity, 1f, new Vector3(-10f, 0f, 0f)), Port.Hidden(Definitions.PORT_ERLBACH_Headlight_V_Cover, "idErlbachPart86", new Vector3(2.1f, 0f, 0f), Quaternion.identity, 1f, new Vector3(-10f, 0f, 0f)),
@@ -161,11 +158,66 @@ public class ModelList
}; };
public static readonly List<ChildModel> ChildModels = new List<ChildModel>() public static readonly List<ChildModel> ChildModels = new List<ChildModel>()
{ {
//Felge 1 //Felgensets
new ChildModel(
Definitions.PORT_ERL_RIMS,
"Normal Rims",
"erlRims_1",
Resources.Load<Material>($"Material/AluminiumScratched"),
Vector3.zero, // offset to the port
Quaternion.identity,
Vector3.one,
new List<Port>
{
Port.Hidden(Definitions.PORT_ERL_RIM_LH, "erlRim1_LH", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, -30f, 0f)),
Port.Hidden(Definitions.PORT_ERL_RIM_LV, "erlRim1_LV", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, -30f, 0f)),
Port.Hidden(Definitions.PORT_ERL_RIM_RH, "erlRim1_RH", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, 30f, 0f)),
Port.Hidden(Definitions.PORT_ERL_RIM_RV, "erlRim1_RV", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, 30f, 0f)),
},
DefaultColors,
true
),
new ChildModel(
Definitions.PORT_ERL_RIMS,
"Sport Rims",
"erlRims_2",
Resources.Load<Material>($"Material/AluminiumScratched"),
Vector3.zero, // offset to the port
Quaternion.identity,
Vector3.one,
new List<Port>
{
Port.Hidden(Definitions.PORT_ERL_RIM_LH, "erlRim2_LH", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, -30f, 0f)),
Port.Hidden(Definitions.PORT_ERL_RIM_LV, "erlRim2_LV", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, -30f, 0f)),
Port.Hidden(Definitions.PORT_ERL_RIM_RH, "erlRim2_RH", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, 30f, 0f)),
Port.Hidden(Definitions.PORT_ERL_RIM_RV, "erlRim2_RV", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, 30f, 0f)),
},
DefaultColors,
true
),
new ChildModel(
Definitions.PORT_ERL_RIMS,
"Elegance Rims",
"erlRims_3",
Resources.Load<Material>($"Material/AluminiumScratched"),
Vector3.zero, // offset to the port
Quaternion.identity,
Vector3.one,
new List<Port>
{
Port.Hidden(Definitions.PORT_ERL_RIM_LH, "erlRim3_LH", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, -30f, 0f)),
Port.Hidden(Definitions.PORT_ERL_RIM_LV, "erlRim3_LV", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, -30f, 0f)),
Port.Hidden(Definitions.PORT_ERL_RIM_RH, "erlRim3_RH", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, 30f, 0f)),
Port.Hidden(Definitions.PORT_ERL_RIM_RV, "erlRim3_RV", Vector3.zero, Quaternion.identity, 1f, new Vector3(0f, 30f, 0f)),
},
DefaultColors,
true
),
// Sport
new ChildModel( new ChildModel(
Definitions.PORT_ERL_RIM_RH, Definitions.PORT_ERL_RIM_RH,
"Sport Rim", "Sport Rim",
"radRH", "erlRim2_RH",
Resources.Load<Mesh>($"Model/ERLbach/Felge1"), Resources.Load<Mesh>($"Model/ERLbach/Felge1"),
Resources.Load<Material>($"Material/AluminiumScratched"), Resources.Load<Material>($"Material/AluminiumScratched"),
new Vector3(60f, 65f, -15f), // offset to the port new Vector3(60f, 65f, -15f), // offset to the port
@@ -177,7 +229,7 @@ public class ModelList
new ChildModel( new ChildModel(
Definitions.PORT_ERL_RIM_RV, Definitions.PORT_ERL_RIM_RV,
"Sport Rim", "Sport Rim",
"radRV", "erlRim2_RV",
Resources.Load<Mesh>($"Model/ERLbach/Felge1"), Resources.Load<Mesh>($"Model/ERLbach/Felge1"),
Resources.Load<Material>($"Material/AluminiumScratched"), Resources.Load<Material>($"Material/AluminiumScratched"),
new Vector3(-105f, 65f, -15f), // offset to the port new Vector3(-105f, 65f, -15f), // offset to the port
@@ -189,7 +241,7 @@ public class ModelList
new ChildModel( new ChildModel(
Definitions.PORT_ERL_RIM_LV, Definitions.PORT_ERL_RIM_LV,
"Sport Rim", "Sport Rim",
"radLV", "erlRim2_LV",
Resources.Load<Mesh>($"Model/ERLbach/Felge1"), Resources.Load<Mesh>($"Model/ERLbach/Felge1"),
Resources.Load<Material>($"Material/AluminiumScratched"), Resources.Load<Material>($"Material/AluminiumScratched"),
new Vector3(-105f, -30f, -15f), // offset to the port new Vector3(-105f, -30f, -15f), // offset to the port
@@ -201,7 +253,7 @@ public class ModelList
new ChildModel( new ChildModel(
Definitions.PORT_ERL_RIM_LH, Definitions.PORT_ERL_RIM_LH,
"Sport Rim", "Sport Rim",
"rimLH", "erlRim2_LH",
Resources.Load<Mesh>($"Model/ERLbach/Felge1"), Resources.Load<Mesh>($"Model/ERLbach/Felge1"),
Resources.Load<Material>($"Material/AluminiumScratched"), Resources.Load<Material>($"Material/AluminiumScratched"),
new Vector3(-60f, -30f, -15f), // offset to the port new Vector3(-60f, -30f, -15f), // offset to the port
@@ -210,11 +262,11 @@ public class ModelList
null, null,
DefaultColors DefaultColors
), ),
//Felge 2 // Elegance
new ChildModel( new ChildModel(
Definitions.PORT_ERL_RIM_RH, Definitions.PORT_ERL_RIM_RH,
"Elegance Rim", "Elegance Rim",
"erlRimRH3", "erlRim3_RH",
Resources.Load<Mesh>($"Model/ERLbach/Felge3"), Resources.Load<Mesh>($"Model/ERLbach/Felge3"),
Resources.Load<Material>($"Material/AluminiumScratched"), Resources.Load<Material>($"Material/AluminiumScratched"),
new Vector3(60f, 65f, -15f), // offset to the port new Vector3(60f, 65f, -15f), // offset to the port
@@ -226,7 +278,7 @@ public class ModelList
new ChildModel( new ChildModel(
Definitions.PORT_ERL_RIM_RV, Definitions.PORT_ERL_RIM_RV,
"Elegance Rim", "Elegance Rim",
"erlRimRV3", "erlRim3_RV",
Resources.Load<Mesh>($"Model/ERLbach/Felge3"), Resources.Load<Mesh>($"Model/ERLbach/Felge3"),
Resources.Load<Material>($"Material/AluminiumScratched"), Resources.Load<Material>($"Material/AluminiumScratched"),
new Vector3(-105f, 65f, -15f), // offset to the port new Vector3(-105f, 65f, -15f), // offset to the port
@@ -238,7 +290,7 @@ public class ModelList
new ChildModel( new ChildModel(
Definitions.PORT_ERL_RIM_LV, Definitions.PORT_ERL_RIM_LV,
"Elegance Rim", "Elegance Rim",
"erlRimLV3", "erlRim3_LV",
Resources.Load<Mesh>($"Model/ERLbach/Felge3"), Resources.Load<Mesh>($"Model/ERLbach/Felge3"),
Resources.Load<Material>($"Material/AluminiumScratched"), Resources.Load<Material>($"Material/AluminiumScratched"),
new Vector3(-105f, -30f, -15f), // offset to the port new Vector3(-105f, -30f, -15f), // offset to the port
@@ -250,7 +302,7 @@ public class ModelList
new ChildModel( new ChildModel(
Definitions.PORT_ERL_RIM_LH, Definitions.PORT_ERL_RIM_LH,
"Elegance Rim", "Elegance Rim",
"erlRimLH3", "erlRim3_LH",
Resources.Load<Mesh>($"Model/ERLbach/Felge3"), Resources.Load<Mesh>($"Model/ERLbach/Felge3"),
Resources.Load<Material>($"Material/AluminiumScratched"), Resources.Load<Material>($"Material/AluminiumScratched"),
new Vector3(-60f, -30f, -15f), // offset to the port new Vector3(-60f, -30f, -15f), // offset to the port
@@ -259,6 +311,7 @@ public class ModelList
null, null,
DefaultColors DefaultColors
), ),
// GRILL
new ChildModel( new ChildModel(
Definitions.PORT_ERLBACH_GRILL, Definitions.PORT_ERLBACH_GRILL,
"Grille Elegance", "Grille Elegance",
@@ -389,14 +442,14 @@ public class ModelList
new ModelElement( Definitions.PORT_ERLBACH_77, "Erlbach Part 77", "idErlbachPart77", Resources.Load<Material>($"Material/PVC"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ), new ModelElement( Definitions.PORT_ERLBACH_77, "Erlbach Part 77", "idErlbachPart77", Resources.Load<Material>($"Material/PVC"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ),
new ModelElement( Definitions.PORT_ERLBACH_78, "Erlbach Part 78", "idErlbachPart78", Resources.Load<Material>($"Material/PVC"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ), new ModelElement( Definitions.PORT_ERLBACH_78, "Erlbach Part 78", "idErlbachPart78", Resources.Load<Material>($"Material/PVC"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ),
new ModelElement( Definitions.PORT_ERLBACH_79, "Erlbach Part 79", "idErlbachPart79", Resources.Load<Material>($"Material/PVC"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ), new ModelElement( Definitions.PORT_ERLBACH_79, "Erlbach Part 79", "idErlbachPart79", Resources.Load<Material>($"Material/PVC"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ),
new ModelElement( Definitions.PORT_ERL_TIRE_LH, "Tire LH", "LH", Resources.Load<Material>($"Material/CarTire"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ), new ModelElement( Definitions.PORT_ERL_TIRE_LH, "Tire LH", "erlTire1_LH", Resources.Load<Material>($"Material/CarTire"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ),
new ModelElement( Definitions.PORT_ERL_RIM_LH, "Standard Rim", "idErlbachWheel_LH", Resources.Load<Material>($"Material/AluminiumScratched"), Vector3.zero, Quaternion.identity, Vector3.one, null, DefaultColors ), new ModelElement( Definitions.PORT_ERL_RIM_LH, "Standard Rim", "erlRim1_LH", Resources.Load<Material>($"Material/AluminiumScratched"), Vector3.zero, Quaternion.identity, Vector3.one, null, DefaultColors ),
new ModelElement( Definitions.PORT_ERL_TIRE_LV, "Tire LV", "LV", Resources.Load<Material>($"Material/CarTire"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ), new ModelElement( Definitions.PORT_ERL_TIRE_LV, "Tire LV", "erlTire1_LV", Resources.Load<Material>($"Material/CarTire"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ),
new ModelElement( Definitions.PORT_ERL_RIM_LV, "Standard Rim", "idErlbachWheel_LV", Resources.Load<Material>($"Material/AluminiumScratched"), Vector3.zero, Quaternion.identity, Vector3.one, null, DefaultColors ), new ModelElement( Definitions.PORT_ERL_RIM_LV, "Standard Rim", "erlRim1_LV", Resources.Load<Material>($"Material/AluminiumScratched"), Vector3.zero, Quaternion.identity, Vector3.one, null, DefaultColors ),
new ModelElement( Definitions.PORT_ERL_TIRE_RH, "Tire RH", "RH", Resources.Load<Material>($"Material/CarTire"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ), new ModelElement( Definitions.PORT_ERL_TIRE_RH, "Tire RH", "erlTire1_RH", Resources.Load<Material>($"Material/CarTire"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ),
new ModelElement( Definitions.PORT_ERL_RIM_RH, "Standard Rim", "idErlbachWheel_RH", Resources.Load<Material>($"Material/AluminiumScratched"), Vector3.zero, Quaternion.identity, Vector3.one, null, DefaultColors ), new ModelElement( Definitions.PORT_ERL_RIM_RH, "Standard Rim", "erlRim1_RH", Resources.Load<Material>($"Material/AluminiumScratched"), Vector3.zero, Quaternion.identity, Vector3.one, null, DefaultColors ),
new ModelElement( Definitions.PORT_ERL_TIRE_RV, "Tire RV", "RV", Resources.Load<Material>($"Material/CarTire"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ), new ModelElement( Definitions.PORT_ERL_TIRE_RV, "Tire RV", "erlTire1_RV", Resources.Load<Material>($"Material/CarTire"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ),
new ModelElement( Definitions.PORT_ERL_RIM_RV, "Standard Rim", "idErlbachWheel_RV", Resources.Load<Material>($"Material/AluminiumScratched"), Vector3.zero, Quaternion.identity, Vector3.one, null, DefaultColors ), new ModelElement( Definitions.PORT_ERL_RIM_RV, "Standard Rim", "erlRim1_RV", Resources.Load<Material>($"Material/AluminiumScratched"), Vector3.zero, Quaternion.identity, Vector3.one, null, DefaultColors ),
new ModelElement( Definitions.PORT_ERLBACH_Body, "Body", "idErlbachPart84", Resources.Load<Material>($"Material/AluminiumPolished"), Vector3.zero, Quaternion.identity, Vector3.one, null, DefaultColors ), new ModelElement( Definitions.PORT_ERLBACH_Body, "Body", "idErlbachPart84", Resources.Load<Material>($"Material/AluminiumPolished"), Vector3.zero, Quaternion.identity, Vector3.one, null, DefaultColors ),
new ModelElement( Definitions.PORT_ERLBACH_Bumper, "Rear Bumper", "idErlbachPart85", Resources.Load<Material>($"Material/AluminiumPolished"), Vector3.zero, Quaternion.identity, Vector3.one, null, DefaultColors ), new ModelElement( Definitions.PORT_ERLBACH_Bumper, "Rear Bumper", "idErlbachPart85", Resources.Load<Material>($"Material/AluminiumPolished"), Vector3.zero, Quaternion.identity, Vector3.one, null, DefaultColors ),
new ModelElement( Definitions.PORT_ERLBACH_Headlight_V_Cover, "Headlight Cover", "idErlbachPart86", Resources.Load<Material>($"Material/AluminiumPolished"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ), new ModelElement( Definitions.PORT_ERLBACH_Headlight_V_Cover, "Headlight Cover", "idErlbachPart86", Resources.Load<Material>($"Material/AluminiumPolished"), Vector3.zero, Quaternion.identity, Vector3.one, null, null ),

View File

@@ -73,7 +73,7 @@ public class ModelManager : MonoBehaviour, IResettable
void RegisterChildModel(ChildModel model) void RegisterChildModel(ChildModel model)
{ {
Debug.Log($"Registering {model.NameId} for Port {model.Port} ({model})"); Debug.Log($"Registering {model.NameId} for Port {model.ParentPort} ({model})");
//childModelDict //childModelDict
if (_childModelDict.ContainsKey(model.NameId)) if (_childModelDict.ContainsKey(model.NameId))
{ {
@@ -83,21 +83,21 @@ public class ModelManager : MonoBehaviour, IResettable
_childModelDict[model.NameId] = model; _childModelDict[model.NameId] = model;
//portDict //portDict
if (string.IsNullOrEmpty(model.Port)) if (string.IsNullOrEmpty(model.ParentPort))
{ {
Debug.LogWarning("Model " + model.NameId + " has no Port! [portDict] Skipping..."); Debug.LogWarning("Model " + model.NameId + " has no Port! [portDict] Skipping...");
return; return;
} }
if (!_portDict.ContainsKey(model.Port)) if (!_portDict.ContainsKey(model.ParentPort))
{ {
_portDict.Add(model.Port, new HashSet<ChildModel>()); _portDict.Add(model.ParentPort, new HashSet<ChildModel>());
} }
if (_portDict[model.Port].Contains(model)) if (_portDict[model.ParentPort].Contains(model))
{ {
Debug.LogWarning("Model " + model.NameId + " already registered! [portDict] Skipping..."); Debug.LogWarning("Model " + model.NameId + " already registered! [portDict] Skipping...");
return; return;
} }
_portDict[model.Port].Add(model); _portDict[model.ParentPort].Add(model);
} }
void RegisterBaseModel(BaseModel baseModel) void RegisterBaseModel(BaseModel baseModel)
@@ -132,22 +132,20 @@ public class ModelManager : MonoBehaviour, IResettable
public void LoadSelectedModel(BaseModel baseModel) public void LoadSelectedModel(BaseModel baseModel)
{ {
Debug.Log($"Model {baseModel.NameHuman} started loading.");
//create if doesn't exist //create if doesn't exist
if (this.baseModelGO == null) if (baseModelGO == null)
{ {
// Create new GameObject for the baseModel Debug.Log($"Spawning BaseModelGO.");
this.baseModelGO = new GameObject(baseModel.NameId) baseModelGO = new GameObject(baseModel.NameId);
{ baseModelGO.AddComponent<BaseModelBehaviour>();
name = baseModel.NameId, baseModelGO.transform.position = new Vector3(0, 0, 1);
}; baseModelGO.transform.localRotation = Quaternion.Euler(0, 90, 0);
this.baseModelGO.AddComponent<BaseModelBehaviour>(); baseModelGO.SetActive(true);
// Positioning Debug.Log($"Spawned BaseModelGO.");
this.baseModelGO.transform.position = new Vector3(0, 0, 1);
this.baseModelGO.transform.localRotation = Quaternion.Euler(0, 90, 0);
this.baseModelGO.SetActive(true);
} }
this.baseModelGO.GetComponent<BaseModelBehaviour>().BaseModel = baseModel; baseModelGO.GetComponent<BaseModelBehaviour>().BaseModel = baseModel;
this.baseModelGO.SetActive(true); baseModelGO.SetActive(true);
Debug.Log($"Model {baseModel.NameHuman} lock and loaded."); Debug.Log($"Model {baseModel.NameHuman} lock and loaded.");
} }
@@ -176,23 +174,9 @@ public class ModelManager : MonoBehaviour, IResettable
tw.Write(BaseModelBehaviour.ExportJson()); tw.Write(BaseModelBehaviour.ExportJson());
tw.Close(); tw.Close();
} }
public Port GetPortForChildModel(ChildModel childModel)
{
foreach (var port in BaseModel.Ports)
{
if (port.PortID == childModel.Port)
{
return port;
}
}
Debug.Log($"No child model found for port {childModel.Port}");
return null;
}
public void ResetThis() public void ResetThis()
{ {
OpenSelector(); OpenSelector();
BaseModelBehaviour.ClearChildren();
} }
} }

View File

@@ -37,7 +37,7 @@ public class ChildModelSelector : MonoBehaviour, IResettable
foreach (var childModel in childModels) foreach (var childModel in childModels)
{ {
Debug.Log($"Adding {childModel}"); Debug.Log($"Adding {childModel}");
GameObject go = Spawn.GO(cmpPrefab, daddy.transform, Vector3.zero, "picker:" + childModel.Port + ":" + childModel.NameId); GameObject go = Spawn.GO(cmpPrefab, daddy.transform, Vector3.zero, "picker:" + childModel.ParentPort + ":" + childModel.NameId);
go.SetActive(true); go.SetActive(true);
go.GetNamedChild("Icon").GetComponent<Image>().sprite = Resources.Load<Sprite>($"sprites/" + childModel.NameId); go.GetNamedChild("Icon").GetComponent<Image>().sprite = Resources.Load<Sprite>($"sprites/" + childModel.NameId);
TextMeshProUGUI[] label = go.GetComponentsInChildren<TextMeshProUGUI>(); TextMeshProUGUI[] label = go.GetComponentsInChildren<TextMeshProUGUI>();