mirror of
https://github.com/GTA-ASM/SanAndreasUnity
synced 2024-11-26 14:00:17 +00:00
change vehicle's color system to use Color32 instead of indices
This commit is contained in:
parent
a3e7f7ebe7
commit
6d1b0f0a78
4 changed files with 62 additions and 23 deletions
|
@ -115,8 +115,10 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
|||
|
||||
public static int MeshLayer => UnityEngine.LayerMask.NameToLayer("VehicleMesh");
|
||||
|
||||
private readonly int[] _colors = { 0, 0, 0, 0 };
|
||||
public int[] Colors => _colors;
|
||||
public static readonly Color32 DefaultVehicleColor = default;
|
||||
|
||||
private readonly Color32[] _colors = { DefaultVehicleColor, DefaultVehicleColor, DefaultVehicleColor, DefaultVehicleColor };
|
||||
public IReadOnlyList<Color32> Colors => _colors;
|
||||
private readonly float[] _lights = { 0, 0, 0, 0 };
|
||||
private MaterialPropertyBlock _props;
|
||||
private static readonly int CarColorPropertyId = Shader.PropertyToID("_CarColor");
|
||||
|
@ -206,10 +208,19 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
|||
|
||||
public void SetColors(params int[] clrIndices)
|
||||
{
|
||||
for (var i = 0; i < 4 && i < clrIndices.Length; ++i)
|
||||
this.SetColors(CarColors.FromIndices(clrIndices));
|
||||
}
|
||||
|
||||
public void SetColors(Color32[] colors)
|
||||
{
|
||||
if (_colors[i].Equals(clrIndices[i])) continue;
|
||||
_colors[i] = clrIndices[i];
|
||||
/*if (colors.Length > 4)
|
||||
throw new System.ArgumentException("Vehicle can not have more than 4 colors");*/
|
||||
|
||||
for (int i = 0; i < 4 && i < colors.Length; ++i)
|
||||
{
|
||||
if (_colors[i].Equals(colors[i]))
|
||||
continue;
|
||||
_colors[i] = colors[i];
|
||||
_colorsChanged = true;
|
||||
}
|
||||
}
|
||||
|
@ -437,12 +448,10 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
|||
|
||||
public static void UpdateMaterials(
|
||||
FrameContainer frames,
|
||||
int[] colors,
|
||||
Color32[] paintJobColors,
|
||||
float[] lights,
|
||||
MaterialPropertyBlock materialPropertyBlock)
|
||||
{
|
||||
var indices = CarColors.FromIndices(colors);
|
||||
|
||||
Color32 headLightColor = new Color32(255, 255, 255, 255);
|
||||
Color32 tailLightColor = new Color32(255, 255, 255, 255);
|
||||
|
||||
|
@ -450,10 +459,10 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
|||
Color32[] carColors = new []
|
||||
{
|
||||
new Color32(255, 255, 255, 255),
|
||||
indices[0],
|
||||
indices[1],
|
||||
indices[2],
|
||||
indices[3],
|
||||
paintJobColors[0],
|
||||
paintJobColors[1],
|
||||
paintJobColors[2],
|
||||
paintJobColors[3],
|
||||
headLightColor,
|
||||
headLightColor,
|
||||
tailLightColor,
|
||||
|
|
|
@ -3,6 +3,7 @@ using SanAndreasUnity.Net;
|
|||
using Mirror;
|
||||
using SanAndreasUnity.Utilities;
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace SanAndreasUnity.Behaviours.Vehicles
|
||||
{
|
||||
|
@ -62,8 +63,12 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
|||
{
|
||||
F.RunExceptionSafe( () => {
|
||||
// load vehicle on clients
|
||||
int[] colors = DeserializeColors(m_net_carColors);
|
||||
m_vehicle = Vehicle.Create(this.gameObject, m_net_id, colors, this.transform.position, this.transform.rotation);
|
||||
|
||||
Color32[] colors = DeserializeColors(m_net_carColors);
|
||||
|
||||
m_vehicle = Vehicle.Create(this.gameObject, m_net_id, null, this.transform.position, this.transform.rotation);
|
||||
|
||||
m_vehicle.SetColors(colors);
|
||||
|
||||
// update rigid body status
|
||||
this.EnableOrDisableRigidBody();
|
||||
|
@ -91,14 +96,38 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
|||
this.EnableOrDisableRigidBody();
|
||||
}
|
||||
|
||||
public static string SerializeColors(int[] colors)
|
||||
public static string SerializeColors(IEnumerable<Color32> colors)
|
||||
{
|
||||
return colors != null ? string.Join(";", colors.Select(c => c.ToString(System.Globalization.CultureInfo.InvariantCulture))) : null;
|
||||
return colors != null
|
||||
? string.Join("|", colors.Select(c => SerializeColor(c)))
|
||||
: null;
|
||||
}
|
||||
|
||||
public static int[] DeserializeColors(string colors)
|
||||
public static Color32[] DeserializeColors(string colors)
|
||||
{
|
||||
return string.IsNullOrEmpty(colors) ? null : colors.Split(';').Select(s => int.Parse(s, System.Globalization.CultureInfo.InvariantCulture)).ToArray();
|
||||
return string.IsNullOrEmpty(colors)
|
||||
? null
|
||||
: colors.Split('|').Select(s => DeserializeColor(s)).ToArray();
|
||||
}
|
||||
|
||||
public static string SerializeColor(Color32 color)
|
||||
{
|
||||
byte[] values = new byte[] { color.r, color.g, color.b, color.a };
|
||||
return string.Join(";", values.Select(v => v.ToString(System.Globalization.CultureInfo.InvariantCulture)));
|
||||
}
|
||||
|
||||
public static Color32 DeserializeColor(string colorString)
|
||||
{
|
||||
string[] splits = colorString.Split(';');
|
||||
|
||||
if (splits.Length != 4)
|
||||
throw new System.ArgumentException($"Failed to deserialize color - expected 4 components, found {splits.Length}");
|
||||
|
||||
return new Color32(
|
||||
byte.Parse(splits[0], System.Globalization.CultureInfo.InvariantCulture),
|
||||
byte.Parse(splits[1], System.Globalization.CultureInfo.InvariantCulture),
|
||||
byte.Parse(splits[2], System.Globalization.CultureInfo.InvariantCulture),
|
||||
byte.Parse(splits[3], System.Globalization.CultureInfo.InvariantCulture));
|
||||
}
|
||||
|
||||
private void Update()
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using SanAndreasUnity.Behaviours.Audio;
|
||||
using SanAndreasUnity.Net;
|
||||
using SanAndreasUnity.Utilities;
|
||||
|
@ -240,7 +241,7 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
|||
DetachFrameFromTransformDuringExplosion(this.transform, frame, mass, parentGo, this.NetIdentity.netId, this.Definition.Id, this.Colors);
|
||||
}
|
||||
|
||||
public static void DetachFrameFromTransformDuringExplosion(Transform tr, Frame frame, float mass, GameObject parentGo, uint vehicleNetId, int vehicleModelId, int[] vehicleColors)
|
||||
public static void DetachFrameFromTransformDuringExplosion(Transform tr, Frame frame, float mass, GameObject parentGo, uint vehicleNetId, int vehicleModelId, IReadOnlyList<Color32> vehicleColors)
|
||||
{
|
||||
if (! tr.IsParentOf(frame.transform)) // already detached ?
|
||||
return;
|
||||
|
|
|
@ -57,7 +57,7 @@ namespace SanAndreasUnity.Net
|
|||
}
|
||||
}
|
||||
|
||||
public void InitializeOnServer(uint vehicleNetId, int vehicleModelId, int[] vehicleColors, string frameName, float mass, Rigidbody rigidbody)
|
||||
public void InitializeOnServer(uint vehicleNetId, int vehicleModelId, IReadOnlyList<Color32> vehicleColors, string frameName, float mass, Rigidbody rigidbody)
|
||||
{
|
||||
NetStatus.ThrowIfNotOnServer();
|
||||
|
||||
|
@ -91,7 +91,7 @@ namespace SanAndreasUnity.Net
|
|||
|
||||
VehicleDef def = Item.GetDefinitionOrThrow<VehicleDef>(m_net_vehicleModelId);
|
||||
|
||||
int[] colors = VehicleController.DeserializeColors(m_net_vehicleColors);
|
||||
Color32[] colors = VehicleController.DeserializeColors(m_net_vehicleColors);
|
||||
|
||||
var geometryParts = Vehicle.LoadGeometryParts(def);
|
||||
|
||||
|
@ -136,7 +136,7 @@ namespace SanAndreasUnity.Net
|
|||
|
||||
}
|
||||
|
||||
private static void SetColors(FrameContainer frames, int[] colors)
|
||||
private static void SetColors(FrameContainer frames, Color32[] colors)
|
||||
{
|
||||
Vehicle.UpdateMaterials(frames, colors, new []{ 0f, 0f, 0f, 0f }, new MaterialPropertyBlock());
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue