Created
December 8, 2021 03:13
-
-
Save gyng/ede2620f8a1c63a1466391ebf05d7b71 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using Dummiesman; | |
using System.IO; | |
using System.Text; | |
using UnityEngine; | |
using UnityEngine.Networking; | |
using System.Collections; | |
public class OBJGenerator : MonoBehaviour | |
{ | |
public Transform transform; | |
// Copy several hardcoded components from this | |
public GameObject sourceObject; | |
public PhysicMaterial material; | |
public string uri; | |
private void Start() | |
{ | |
this.makeOBJ(); | |
} | |
public void makeOBJ() | |
{ | |
// https://raw.githubusercontent.com/gyng/raytracer-assets/master/models/teapot.obj | |
// https://raw.githubusercontent.com/gyng/raytracer-assets/master/models/bunny.obj | |
// https://raw.githubusercontent.com/gyng/raytracer-assets/master/models/cow.obj | |
// https://raw.githubusercontent.com/gyng/raytracer-assets/master/models/tachikoma.obj | |
// https://people.sc.fsu.edu/~jburkardt/data/obj/lamp.obj | |
var defaultObjects = new string[] { | |
"https://raw.githubusercontent.com/gyng/raytracer-assets/master/models/teapot.obj", | |
"https://raw.githubusercontent.com/gyng/raytracer-assets/master/models/bunny.obj", | |
// "https://raw.githubusercontent.com/gyng/raytracer-assets/master/models/cow.obj", | |
// "https://raw.githubusercontent.com/gyng/raytracer-assets/master/models/tachikoma.obj" | |
// "https://people.sc.fsu.edu/~jburkardt/data/obj/lamp.obj" | |
}; | |
var initialUrl = defaultObjects[Random.Range(0, defaultObjects.Length)]; | |
var requestUri = uri == null ? uri : initialUrl; | |
StartCoroutine(GetRequest(requestUri)); | |
} | |
private IEnumerator GetRequest(string uri) | |
{ | |
using (UnityWebRequest webRequest = UnityWebRequest.Get(uri)) | |
{ | |
yield return webRequest.SendWebRequest(); | |
switch (webRequest.result) | |
{ | |
case UnityWebRequest.Result.Success: | |
initObject(webRequest.downloadHandler.text); | |
break; | |
} | |
} | |
} | |
private void initObject(string text) | |
{ | |
var textStream = new MemoryStream(Encoding.UTF8.GetBytes(text)); | |
var go = new OBJLoader().Load(textStream); | |
// CopyComponent<Rigidbody>(sourceObject.GetComponent<Rigidbody>(), go); | |
go.AddComponent<Rigidbody>(); | |
var sourceSize = sourceObject.GetComponent<MeshRenderer>().bounds.size; | |
var child = go.transform.GetChild(0); | |
var mesh = child.GetComponent<MeshRenderer>(); | |
float resizeX = sourceSize.x / mesh.bounds.size.x; | |
float resizeY = sourceSize.y / mesh.bounds.size.y; | |
float resizeZ = sourceSize.z / mesh.bounds.size.z; | |
resizeX *= mesh.transform.localScale.x; | |
resizeY *= mesh.transform.localScale.y; | |
resizeZ *= mesh.transform.localScale.z; | |
float minResize = Mathf.Min(Mathf.Min(resizeX, resizeY), resizeZ); | |
mesh.transform.localScale = new Vector3(minResize, minResize, minResize); | |
var collider = go.AddComponent<MeshCollider>(); | |
var meshFilter = child.GetComponent<MeshFilter>(); | |
collider.sharedMesh = meshFilter.mesh; | |
collider.convex = true; // OVRGrabbable needs this | |
collider.material = material; | |
// var sphereCollider = CopyComponent<SphereCollider>(sourceObject.GetComponent<SphereCollider>(), go); | |
// sphereCollider.isTrigger = true; // Extra collider for easier grabbing | |
var grab = CopyComponent<OVRGrabbable>(sourceObject.GetComponent<OVRGrabbable>(), go); | |
grab.m_grabPoints = new Collider[] { collider }; | |
grab.enabled = true; | |
Instantiate(go, transform); | |
} | |
private static T CopyComponent<T>(T original, GameObject destination) where T : Component | |
{ | |
System.Type type = original.GetType(); | |
Component copy = destination.AddComponent(type); | |
System.Reflection.FieldInfo[] fields = type.GetFields(); | |
foreach (System.Reflection.FieldInfo field in fields) | |
{ | |
field.SetValue(copy, field.GetValue(original)); | |
} | |
return copy as T; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment