117 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using FishNet.CodeGenerating.Extension;
 | |
| using FishNet.CodeGenerating.Helping.Extension;
 | |
| using FishNet.Connection;
 | |
| using MonoFN.Cecil;
 | |
| using MonoFN.Cecil.Cil;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| using SR = System.Reflection;
 | |
| 
 | |
| 
 | |
| namespace FishNet.CodeGenerating.Helping
 | |
| {
 | |
|     internal class PhysicsHelper : CodegenBase
 | |
|     {
 | |
|         #region Reflection references.
 | |
|         public MethodReference GetScene_MethodRef;
 | |
|         public MethodReference GetPhysicsScene2D_MethodRef;
 | |
|         public MethodReference GetPhysicsScene3D_MethodRef;
 | |
|         public MethodReference Physics3D_Simulate_MethodRef;
 | |
|         public MethodReference Physics2D_Simulate_MethodRef;
 | |
|         public MethodReference Physics3D_SyncTransforms_MethodRef;
 | |
|         public MethodReference Physics2D_SyncTransforms_MethodRef;
 | |
|         #endregion
 | |
| 
 | |
|         public override bool ImportReferences()
 | |
|         {
 | |
|             SR.MethodInfo locMi;
 | |
|             //GetScene.
 | |
|             locMi = typeof(GameObject).GetMethod("get_scene");
 | |
|             GetScene_MethodRef = base.ImportReference(locMi);
 | |
| 
 | |
|             //Physics.SyncTransform.
 | |
|             foreach (SR.MethodInfo mi in typeof(Physics).GetMethods())
 | |
|             {
 | |
|                 if (mi.Name == nameof(Physics.SyncTransforms))
 | |
|                 {
 | |
|                     Physics3D_SyncTransforms_MethodRef = base.ImportReference(mi);
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|             foreach (SR.MethodInfo mi in typeof(Physics2D).GetMethods())
 | |
|             {
 | |
|                 if (mi.Name == nameof(Physics2D.SyncTransforms))
 | |
|                 {
 | |
|                     Physics2D_SyncTransforms_MethodRef = base.ImportReference(mi);
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             //PhysicsScene.Simulate.
 | |
|             foreach (SR.MethodInfo mi in typeof(PhysicsScene).GetMethods())
 | |
|             {
 | |
|                 if (mi.Name == nameof(PhysicsScene.Simulate))
 | |
|                 {
 | |
|                     Physics3D_Simulate_MethodRef = base.ImportReference(mi);
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|             foreach (SR.MethodInfo mi in typeof(PhysicsScene2D).GetMethods())
 | |
|             {
 | |
|                 if (mi.Name == nameof(PhysicsScene2D.Simulate))
 | |
|                 {
 | |
|                     Physics2D_Simulate_MethodRef = base.ImportReference(mi);
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             //GetPhysicsScene.
 | |
|             foreach (SR.MethodInfo mi in typeof(PhysicsSceneExtensions).GetMethods())
 | |
|             {
 | |
|                 if (mi.Name == nameof(PhysicsSceneExtensions.GetPhysicsScene))
 | |
|                 {
 | |
|                     GetPhysicsScene3D_MethodRef = base.ImportReference(mi);
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|             foreach (SR.MethodInfo mi in typeof(PhysicsSceneExtensions2D).GetMethods())
 | |
|             {
 | |
|                 if (mi.Name == nameof(PhysicsSceneExtensions2D.GetPhysicsScene2D))
 | |
|                 {
 | |
|                     GetPhysicsScene2D_MethodRef = base.ImportReference(mi);
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Returns instructions to get a physics scene from a gameObject.
 | |
|         /// </summary>
 | |
|         public List<Instruction> GetPhysicsScene(MethodDefinition md, VariableDefinition gameObjectVd, bool threeDimensional)
 | |
|         {
 | |
|             ILProcessor processor = md.Body.GetILProcessor();
 | |
|             return GetPhysicsScene(processor, gameObjectVd, threeDimensional);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Returns instructions to get a physics scene from a gameObject.
 | |
|         /// </summary>
 | |
|         public List<Instruction> GetPhysicsScene(ILProcessor processor, VariableDefinition gameObjectVd, bool threeDimensional)
 | |
|         {
 | |
|             List<Instruction> insts = new List<Instruction>();
 | |
| 
 | |
|             //gameObject.scene.GetPhysics...
 | |
|             insts.Add(processor.Create(OpCodes.Ldloc, gameObjectVd));
 | |
|             insts.Add(processor.Create(GetScene_MethodRef.GetCallOpCode(base.Session), GetScene_MethodRef));
 | |
|             if (threeDimensional)
 | |
|                 insts.Add(processor.Create(OpCodes.Call, GetPhysicsScene3D_MethodRef));
 | |
|             else
 | |
|                 insts.Add(processor.Create(OpCodes.Call, GetPhysicsScene2D_MethodRef));
 | |
| 
 | |
|             return insts;
 | |
|         }
 | |
|     }
 | |
| } |