Use the same (physics) componentts and attempt to use custom material

This commit is contained in:
Norbi Peti 2020-12-12 02:28:42 +01:00
parent 56a64daa18
commit 432d6bcf96

View file

@ -3,27 +3,22 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Reflection.Emit;
using System.Text.Formatting;
using DataLoader; using DataLoader;
using GamecraftModdingAPI.Utility;
using GPUInstancer; using GPUInstancer;
using HarmonyLib; using HarmonyLib;
using RobocraftX.Blocks.Ghost; using RobocraftX.Blocks;
using RobocraftX.Common; using RobocraftX.Common;
using RobocraftX.Schedulers; using RobocraftX.Rendering;
using Svelto.DataStructures; using Svelto.DataStructures;
using Svelto.ECS.Extensions.Unity;
using Svelto.Tasks; using Svelto.Tasks;
using Svelto.Tasks.ExtraLean;
using Unity.Entities; using Unity.Entities;
using Unity.Entities.Conversion; using Unity.Entities.Conversion;
using Unity.Physics; using Unity.Physics;
using UnityEngine; using UnityEngine;
using UnityEngine.AddressableAssets; using UnityEngine.AddressableAssets;
using BoxCollider = UnityEngine.BoxCollider; using BoxCollider = UnityEngine.BoxCollider;
using Collider = UnityEngine.Collider;
using Material = UnityEngine.Material; using Material = UnityEngine.Material;
using Object = UnityEngine.Object;
namespace GamecraftModdingAPI.Blocks namespace GamecraftModdingAPI.Blocks
{ {
@ -122,7 +117,7 @@ namespace GamecraftModdingAPI.Blocks
} }
} }
[HarmonyPatch] /*[HarmonyPatch]
public static class RendererPatch public static class RendererPatch
{ {
private static Material[] materials; private static Material[] materials;
@ -134,9 +129,16 @@ namespace GamecraftModdingAPI.Blocks
//Console.WriteLine("Length: " + gameObject.GetComponentsInChildren<MeshRenderer>().Length); //Console.WriteLine("Length: " + gameObject.GetComponentsInChildren<MeshRenderer>().Length);
if (materials != null) if (materials != null)
gameObject.GetComponentsInChildren<MeshRenderer>()[0].sharedMaterials = materials; gameObject.GetComponentsInChildren<MeshRenderer>()[0].sharedMaterials = materials;
ECSGPUIResourceManager.Instance.RegisterRuntimePrefabs( /*ECSGPUIResourceManager.Instance.RegisterGhostsPrefabsAtRuntime(
new[] {new PrefabData {prefabId = prefabID, prefabName = "Assets/Prefabs/Cube.prefab"}}, new[] {new PrefabData {prefabId = prefabID, prefabName = "Assets/Prefabs/Cube.prefab"}},
new List<GameObject> {gameObject}).Complete(); new List<GameObject> {gameObject});#1#
GameObject go = Object.Instantiate(gameObject);
go.SetActive(false);
AccessTools.Method("RobocraftX.Rendering.ECSGPUIResourceManager:RegisterNewPrefabAtRuntime")
.Invoke(ECSGPUIResourceManager.Instance,
new object[] {(uint) ((int) prefabID * 2 + 1), gameObject, true});
//ECSGPUIResourceManager.Instance.RegisterNewPrefabAtRuntime((uint) ((int)prefabID * 2 + 1), gameObject, true); //.isOcclusionCulling = false;
UnityEngine.Object.Destroy(gameObject);
GPUInstancerAPI.AddInstancesToPrefabPrototypeAtRuntime(ECSGPUIResourceManager.Instance.prefabManager, GPUInstancerAPI.AddInstancesToPrefabPrototypeAtRuntime(ECSGPUIResourceManager.Instance.prefabManager,
gameObject.GetComponent<GPUInstancerPrefab>().prefabPrototype, new[] {gameObject}); gameObject.GetComponent<GPUInstancerPrefab>().prefabPrototype, new[] {gameObject});
Console.WriteLine("Registered prefab to instancer"); Console.WriteLine("Registered prefab to instancer");
@ -144,7 +146,7 @@ namespace GamecraftModdingAPI.Blocks
/*var register = AccessTools.Method("RobocraftX.Common.ECSPhysicResourceManager:RegisterPrefab", /*var register = AccessTools.Method("RobocraftX.Common.ECSPhysicResourceManager:RegisterPrefab",
new[] {typeof(uint), typeof(GameObject), typeof(World), typeof(BlobAssetStore)}); new[] {typeof(uint), typeof(GameObject), typeof(World), typeof(BlobAssetStore)});
register.Invoke(ECSPhysicResourceManager.Instance, register.Invoke(ECSPhysicResourceManager.Instance,
new object[] {prefabID, gameObject, MGPatch.data.Item1, MGPatch.data.Item2});*/ new object[] {prefabID, gameObject, MGPatch.data.Item1, MGPatch.data.Item2});#1#
/*Console.WriteLine( /*Console.WriteLine(
"Entity: " + ECSPhysicResourceManager.Instance.GetUECSPhysicEntityPrefab(prefabID)); "Entity: " + ECSPhysicResourceManager.Instance.GetUECSPhysicEntityPrefab(prefabID));
Console.WriteLine("Prefab ID: " + PrefabsID.DBIDMAP[500]); Console.WriteLine("Prefab ID: " + PrefabsID.DBIDMAP[500]);
@ -155,22 +157,23 @@ namespace GamecraftModdingAPI.Blocks
Console.WriteLine("Collider type: " + componentData.ColliderPtr->Type); Console.WriteLine("Collider type: " + componentData.ColliderPtr->Type);
CollisionFilter filter = componentData.Value.Value.Filter; CollisionFilter filter = componentData.Value.Value.Filter;
Console.WriteLine("Filter not empty: " + !filter.IsEmpty); Console.WriteLine("Filter not empty: " + !filter.IsEmpty);
}*/ }#1#
//MGPatch.data.Item1.EntityManager.GetComponentData<>() //MGPatch.data.Item1.EntityManager.GetComponentData<>()
gameObject.AddComponent<BoxCollider>(); gameObject.AddComponent<BoxCollider>();
gameObject.AddComponent<Transform>(); gameObject.AddComponent<Transform>();
Console.WriteLine("Registered prefab to physics"); Console.WriteLine("Registered prefab to physics");
ECSGPUIResourceManager.Instance.RegisterGhostsPrefabsAtRuntime();
} }
else if (gameObject.name == "CTR_CommandBlock") else if (gameObject.name == "CTR_CommandBlock")
materials = gameObject.GetComponentsInChildren<MeshRenderer>()[0].sharedMaterials; materials = gameObject.GetComponentsInChildren<MeshRenderer>()[0].sharedMaterials;
} }
public static MethodBase TargetMethod() public static MethodBase TargetMethod()
{ {RobocraftX.Common.ECSGPUIResourceManager.RegisterPrefab
return AccessTools.Method("RobocraftX.Common.ECSGPUIResourceManager:RegisterPrefab", return AccessTools.Method("RobocraftX.Common.ECSGPUIResourceManager:RegisterPrefab",
new[] {typeof(uint), typeof(GameObject)}); new[] {typeof(uint), typeof(GameObject)});
} }
} }*/
[HarmonyPatch] [HarmonyPatch]
public static class RMPatch public static class RMPatch
@ -180,6 +183,9 @@ namespace GamecraftModdingAPI.Blocks
FasterList<GameObject> gos, FasterList<GameObject> gos,
List<PrefabData> prefabData) List<PrefabData> prefabData)
{ {
Console.WriteLine("First game object data:\n" + gos[0].GetComponents<Component>()
.Select(c => c + " - " + c.name + " " + c.GetType())
.Aggregate((a, b) => a + "\n" + b));
for (var index = 0; index < prefabData.Count; index++) for (var index = 0; index < prefabData.Count; index++)
{ {
var data = prefabData[index]; var data = prefabData[index];
@ -200,12 +206,18 @@ namespace GamecraftModdingAPI.Blocks
Console.WriteLine("Entity " + current + " has collider: " + Console.WriteLine("Entity " + current + " has collider: " +
entityManager.HasComponent<PhysicsCollider>(current)); entityManager.HasComponent<PhysicsCollider>(current));
} }
Console.WriteLine("Adding GPUI prefab");
((GPUInstancerPrefabManager) GPUInstancerManager.activeManagerList.Single(gim =>
gim is GPUInstancerPrefabManager))
.AddRuntimeRegisteredPrefab(gos[index].GetComponent<GPUInstancerPrefab>());
Console.WriteLine("Added GPUI prefab");
} }
} }
public static MethodBase TargetMethod() public static MethodBase TargetMethod()
{ {
return AccessTools.Method("RobocraftX.Common.ECSResourceManagerUtility:RelinkEntities", return AccessTools.Method("RobocraftX.Blocks.ECSResourceManagerUtility:RelinkEntities",
new[] new[]
{ {
typeof(World), typeof(World),