Skip to content

Instantly share code, notes, and snippets.

@gyng
Created December 8, 2021 03:13
Show Gist options
  • Save gyng/ede2620f8a1c63a1466391ebf05d7b71 to your computer and use it in GitHub Desktop.
Save gyng/ede2620f8a1c63a1466391ebf05d7b71 to your computer and use it in GitHub Desktop.
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