Skip to content

Instantly share code, notes, and snippets.

@hecomi
Created November 25, 2014 11:00
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hecomi/e5af54b8269a9e85172c to your computer and use it in GitHub Desktop.
Save hecomi/e5af54b8269a9e85172c to your computer and use it in GitHub Desktop.
Thread 導入したやつ
using System;
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
using System.Threading;
/// <summary>
/// This class provides main interface to the Ovrvision
/// </summary>
public class Ovrvision : MonoBehaviour
{
//Ovrvision Dll import
//ovrvision_csharp.cpp
////////////// Main Ovrvision System //////////////
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern int ovOpen(int locationID, float marker_meter);
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern int ovClose();
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern void ovPreStoreCamData();
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern void ovGetCamImage(System.IntPtr img, int eye, int qt);
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern void ovGetCamImageBGR(System.IntPtr img, int eye, int qt);
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern void ovGetCamImageForUnity(System.IntPtr pImagePtr_Left, System.IntPtr pImagePtr_Right, int qt);
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern void ovGetCamImageWithAR(System.IntPtr img, int eye, int qt);
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern void ovGetCamImageBGRWithAR(System.IntPtr img, int eye, int qt);
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern void ovGetCamImageForUnityWithAR(System.IntPtr pImagePtr_Left, System.IntPtr pImagePtr_Right, int qt);
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern int ovGetPixelSize();
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern int ovGetBufferSize();
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern int ovGetImageWidth();
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern int ovGetImageHeight();
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern int ovGetImageRate();
//Set camera properties
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern void ovSetExposure(int value);
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern void ovSetWhiteBalance(int value);
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern void ovSetContrast(int value);
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern void ovSetSaturation(int value);
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern void ovSetBrightness(int value);
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern void ovSetSharpness(int value);
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern void ovSetGamma(int value);
//Get camera properties
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern int ovGetExposure();
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern int ovGetWhiteBalance();
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern int ovGetContrast();
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern int ovGetSaturation();
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern int ovGetBrightness();
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern int ovGetSharpness();
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern int ovGetGamma();
////////////// Ovrvision AR System //////////////
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern void ovARRender();
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern int ovARGetData(System.IntPtr mdata, int datasize);
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern void ovARSetMarkerSize(float value);
[DllImport("ovrvision", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
static extern float ovARGetMarkerSize();
//Ovrvision config read write
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern int SetParamXMLfromFile(byte[] filename);
[DllImport("ovrvision", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static extern int SaveParamXMLtoFile(byte[] filename);
//camera select define
private const int OV_CAMEYE_LEFT = 0;
private const int OV_CAMEYE_RIGHT = 1;
private const int OV_SET_AUTOMODE = (-1);
//renderer quality
private const int OV_PSQT_NONE = 0; //No Processing quality
private const int OV_PSQT_LOW = 1; //Low Processing quality
private const int OV_PSQT_HIGH = 2; //High Processing quality
//Ar Macro define
private const int MARKERGET_MAXNUM10 = 100; //max marker is 10
private const int MARKERGET_ARG10 = 10;
private const int MARKERGET_RECONFIGURE_NUM = 10;
//Camera GameObject
private GameObject go_cameraPlaneLeft;
private GameObject go_cameraPlaneRight;
//Camera texture
private Texture2D go_CamTexLeft;
private Texture2D go_CamTexRight;
private Color32[] go_pixelsColorLeft;
private Color32[] go_pixelsColorRight;
private GCHandle go_pixelsHandleLeft;
private GCHandle go_pixelsHandleRight;
private System.IntPtr go_pixelsPointerLeft = System.IntPtr.Zero;
private System.IntPtr go_pixelsPointerRight = System.IntPtr.Zero;
// thread
private Thread thread_;
private float[] markerGet = new float[MARKERGET_MAXNUM10];
private int ri = 0;
//public setting var
//Camera status
public bool camStatus = false;
public bool useOvrvisionAR = false;
public int useProcessingQuality = OV_PSQT_HIGH;
//Chroma-key system
public int camViewShader = 0;
public Vector2 chroma_hue = new Vector2(1.0f,0.0f); //x=max y=min (0.0f-1.0f)
public Vector2 chroma_saturation = new Vector2(1.0f,0.0f); //x=max y=min (0.0f-1.0f)
public Vector2 chroma_brightness = new Vector2(1.0f,0.0f); //x=max y=min (0.0f-1.0f)
//property
public OvrvisionProperty camProp = new OvrvisionProperty();
// ------ Function ------
// Use this for initialization
void Awake() {
//Prop awake
camProp.AwakePropSaveToXML();
//Open camera
if (ovOpen (0, 0.15f) == 0) {
camStatus = true;
} else {
camStatus = false;
Debug.LogError ("Ovrvision open error!!");
}
}
// Use this for initialization
void Start()
{
// Initialize camera plane object(Left)
go_cameraPlaneLeft = this.transform.FindChild("CameraPlaneLeft").gameObject;
go_cameraPlaneLeft.transform.localPosition = new Vector3(0.0f, 0.0f, 5.0f); //Default
// Initialize camera plane object(Right)
go_cameraPlaneRight = this.transform.FindChild("CameraPlaneRight").gameObject;
go_cameraPlaneRight.transform.localPosition = new Vector3(0.0f, 0.0f, 5.0f);
//Create cam texture
go_CamTexLeft = new Texture2D(ovGetImageWidth(), ovGetImageHeight(), TextureFormat.RGB24, false);
go_CamTexRight = new Texture2D(ovGetImageWidth(), ovGetImageHeight(), TextureFormat.RGB24, false);
//Cam setting
go_CamTexLeft.wrapMode = TextureWrapMode.Clamp;
go_CamTexRight.wrapMode = TextureWrapMode.Clamp;
//in Oculus Rift camera
if (GameObject.Find("LeftEyeAnchor"))
go_cameraPlaneLeft.transform.parent = GameObject.Find("LeftEyeAnchor").transform;
if (GameObject.Find("RightEyeAnchor"))
go_cameraPlaneRight.transform.parent = GameObject.Find("RightEyeAnchor").transform;
if (camViewShader == 0)
{ //Normal shader
go_cameraPlaneLeft.renderer.material.shader = Shader.Find("Ovrvision/ovTexture");
go_cameraPlaneRight.renderer.material.shader = Shader.Find("Ovrvision/ovTexture");
}
else if (camViewShader == 1)
{ //Chroma-key shader
go_cameraPlaneLeft.renderer.material.shader = Shader.Find("Ovrvision/ovChromaticMask");
go_cameraPlaneRight.renderer.material.shader = Shader.Find("Ovrvision/ovChromaticMask");
go_cameraPlaneLeft.renderer.material.SetFloat("_Color_maxh", chroma_hue.x);
go_cameraPlaneLeft.renderer.material.SetFloat("_Color_minh", chroma_hue.y);
go_cameraPlaneLeft.renderer.material.SetFloat("_Color_maxs", chroma_saturation.x);
go_cameraPlaneLeft.renderer.material.SetFloat("_Color_mins", chroma_saturation.y);
go_cameraPlaneLeft.renderer.material.SetFloat("_Color_maxv", chroma_brightness.x);
go_cameraPlaneLeft.renderer.material.SetFloat("_Color_minv", chroma_brightness.y);
go_cameraPlaneRight.renderer.material.SetFloat("_Color_maxh", chroma_hue.x);
go_cameraPlaneRight.renderer.material.SetFloat("_Color_minh", chroma_hue.y);
go_cameraPlaneRight.renderer.material.SetFloat("_Color_maxs", chroma_saturation.x);
go_cameraPlaneRight.renderer.material.SetFloat("_Color_mins", chroma_saturation.y);
go_cameraPlaneRight.renderer.material.SetFloat("_Color_maxv", chroma_brightness.x);
go_cameraPlaneRight.renderer.material.SetFloat("_Color_minv", chroma_brightness.y);
}
if (!camStatus)
return;
//Camera open only
//Get texture pointer
go_pixelsColorLeft = go_CamTexLeft.GetPixels32();
go_pixelsColorRight = go_CamTexRight.GetPixels32();
go_pixelsHandleLeft = GCHandle.Alloc(go_pixelsColorLeft, GCHandleType.Pinned);
go_pixelsHandleRight = GCHandle.Alloc(go_pixelsColorRight, GCHandleType.Pinned);
go_pixelsPointerLeft = go_pixelsHandleLeft.AddrOfPinnedObject();
go_pixelsPointerRight = go_pixelsHandleRight.AddrOfPinnedObject();
go_cameraPlaneLeft.renderer.material.mainTexture = go_CamTexLeft;
go_cameraPlaneRight.renderer.material.mainTexture = go_CamTexRight;
// thread
thread_ = new Thread(OvrImageFunc);
thread_.Start();
}
void OvrImageFunc()
{
try {
for (;;) {
Thread.Sleep(0);
if (!camStatus || go_pixelsPointerLeft == System.IntPtr.Zero ||
go_pixelsPointerRight == System.IntPtr.Zero) {
return;
}
if (useOvrvisionAR) {
ovGetCamImageForUnityWithAR(go_pixelsPointerLeft, go_pixelsPointerRight, useProcessingQuality);
ovARRender();
GCHandle marker = GCHandle.Alloc(markerGet, GCHandleType.Pinned);
ri = ovARGetData(marker.AddrOfPinnedObject(), MARKERGET_MAXNUM10);
marker.Free();
} else {
ovGetCamImageForUnity(go_pixelsPointerLeft, go_pixelsPointerRight, useProcessingQuality);
}
}
} catch (Exception e) {
if (!(e is ThreadAbortException)) {
Debug.LogError("Unexpected Death: " + e.ToString());
}
}
}
// Update is called once per frame
void Update ()
{
//camStatus
if (!camStatus)
return;
if (go_pixelsPointerLeft == System.IntPtr.Zero ||
go_pixelsPointerRight == System.IntPtr.Zero)
return;
//get image data
if (useOvrvisionAR) {
OvrvisionARRender();
}
//Apply
go_CamTexLeft.SetPixels32(go_pixelsColorLeft);
go_CamTexLeft.Apply();
go_CamTexRight.SetPixels32(go_pixelsColorRight);
go_CamTexRight.Apply();
//Key Input
CameraViewKeySetting ();
}
//GUI view
void OnGUI() {
//Error
if (!camStatus) {
GUIStyle guiStyle = new GUIStyle();
guiStyle.normal.textColor = Color.red; //error color
//ovrvision not found.
GUI.Label (new Rect (20, 20, 300, 40), "[Error] Ovrvision not found.", guiStyle);
}
}
//CameraViewKeySetting method
void CameraViewKeySetting()
{
//Camera View Setting
if (Input.GetKeyDown (KeyCode.UpArrow)) {
go_cameraPlaneRight.transform.localScale += new Vector3(-0.01f, 0.01f, 0.01f);
go_cameraPlaneLeft.transform.localScale += new Vector3(-0.01f, 0.01f, 0.01f);
}
if (Input.GetKeyDown (KeyCode.DownArrow)) {
go_cameraPlaneRight.transform.localScale -= new Vector3(-0.01f, 0.01f, 0.01f);
go_cameraPlaneLeft.transform.localScale -= new Vector3(-0.01f, 0.01f, 0.01f);
}
if (Input.GetKeyDown (KeyCode.RightArrow)) {
go_cameraPlaneRight.transform.localPosition += new Vector3(0.1f,0.0f,0.0f);
go_cameraPlaneLeft.transform.localPosition += new Vector3(-0.1f,0.0f,0.0f);
}
if (Input.GetKeyDown (KeyCode.LeftArrow)) {
go_cameraPlaneRight.transform.localPosition += new Vector3(-0.1f,0.0f,0.0f);
go_cameraPlaneLeft.transform.localPosition += new Vector3(0.1f,0.0f,0.0f);
}
//Change quality
if (Input.GetKeyDown(KeyCode.Alpha1))
useProcessingQuality = OV_PSQT_NONE;
if (Input.GetKeyDown(KeyCode.Alpha2))
useProcessingQuality = OV_PSQT_LOW;
if (Input.GetKeyDown(KeyCode.Alpha3))
useProcessingQuality = OV_PSQT_HIGH;
}
//Ovrvision AR Render to OversitionTracker Objects.
int OvrvisionARRender()
{
OvrvisionTracker[] otobjs = GameObject.FindObjectsOfType(typeof(OvrvisionTracker)) as OvrvisionTracker[];
foreach (OvrvisionTracker otobj in otobjs)
{
otobj.UpdateTransformNone();
for (int i = 0; i < ri; i++)
{
if (otobj.markerID == (int)markerGet[i * MARKERGET_ARG10])
{
otobj.UpdateTransform(markerGet, i);
break;
}
}
}
return ri;
}
// Quit
void OnDestroy()
{
if (thread_.IsAlive) {
thread_.Abort();
}
if (!camStatus)
return;
//Close camera
if(ovClose () != 0)
Debug.LogError ("Ovrvision close error!!");
//free
go_pixelsHandleLeft.Free ();
go_pixelsHandleRight.Free ();
camStatus = false;
}
//Public methods.
//UpdateOvrvisionSetting method
public void UpdateOvrvisionSetting(OvrvisionProperty prop)
{
if (!camStatus)
return;
//set config
ovSetExposure (prop.exposure);
ovSetWhiteBalance (prop.whitebalance);
ovSetContrast (prop.contrast);
ovSetSaturation (prop.saturation);
ovSetBrightness (prop.brightness);
ovSetSharpness (prop.sharpness);
ovSetGamma (prop.gamma);
//change shader
if (camViewShader == 0)
{ //Normal shader
go_cameraPlaneLeft.renderer.material.shader = Shader.Find("Ovrvision/ovTexture");
go_cameraPlaneRight.renderer.material.shader = Shader.Find("Ovrvision/ovTexture");
}
else if (camViewShader == 1)
{ //Chroma-key shader
go_cameraPlaneLeft.renderer.material.shader = Shader.Find("Ovrvision/ovChromaticMask");
go_cameraPlaneRight.renderer.material.shader = Shader.Find("Ovrvision/ovChromaticMask");
go_cameraPlaneLeft.renderer.material.SetFloat("_Color_maxh", chroma_hue.x);
go_cameraPlaneLeft.renderer.material.SetFloat("_Color_minh", chroma_hue.y);
go_cameraPlaneLeft.renderer.material.SetFloat("_Color_maxs", chroma_saturation.x);
go_cameraPlaneLeft.renderer.material.SetFloat("_Color_mins", chroma_saturation.y);
go_cameraPlaneLeft.renderer.material.SetFloat("_Color_maxv", chroma_brightness.x);
go_cameraPlaneLeft.renderer.material.SetFloat("_Color_minv", chroma_brightness.y);
go_cameraPlaneRight.renderer.material.SetFloat("_Color_maxh", chroma_hue.x);
go_cameraPlaneRight.renderer.material.SetFloat("_Color_minh", chroma_hue.y);
go_cameraPlaneRight.renderer.material.SetFloat("_Color_maxs", chroma_saturation.x);
go_cameraPlaneRight.renderer.material.SetFloat("_Color_mins", chroma_saturation.y);
go_cameraPlaneRight.renderer.material.SetFloat("_Color_maxv", chroma_brightness.x);
go_cameraPlaneRight.renderer.material.SetFloat("_Color_minv", chroma_brightness.y);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment