enable, move, disable solids in vr
This commit is contained in:
parent
533e712c3f
commit
160f048d72
2 changed files with 129 additions and 59 deletions
154
MonoNet.cs
154
MonoNet.cs
|
@ -13,8 +13,8 @@ public class MonoNet {
|
||||||
public MonoNet(Mono mono) {
|
public MonoNet(Mono mono) {
|
||||||
this.mono = mono;
|
this.mono = mono;
|
||||||
Random rnd = new Random();
|
Random rnd = new Random();
|
||||||
me = new Peer(rnd.Next(1, 256)); // let the server determine these
|
me = new Peer(rnd.Next(1, 1024 * 8), SolidType.Normal, Color.White); // let the server determine the id
|
||||||
me.block = new Block(new Vec3((float)rnd.NextDouble() * 0.5f, 10, -4), Quat.Identity, SolidType.Normal, Color.White);
|
// me.block = new Block(new Vec3((float)rnd.NextDouble() * 0.5f, 10, -4), Quat.Identity, SolidType.Normal, Color.White);
|
||||||
}
|
}
|
||||||
public Socket socket;
|
public Socket socket;
|
||||||
int bufferSize = 1024;
|
int bufferSize = 1024;
|
||||||
|
@ -38,7 +38,7 @@ public class MonoNet {
|
||||||
// synth.Speak("oriels!");
|
// synth.Speak("oriels!");
|
||||||
|
|
||||||
// SpeechRecognitionEngine reco = new SpeechRecognitionEngine();
|
// SpeechRecognitionEngine reco = new SpeechRecognitionEngine();
|
||||||
|
|
||||||
// System.IO.Stream s;
|
// System.IO.Stream s;
|
||||||
// // s.Write();
|
// // s.Write();
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ public class MonoNet {
|
||||||
Thread writeThread = new Thread(Write);
|
Thread writeThread = new Thread(Write);
|
||||||
writeThread.Start();
|
writeThread.Start();
|
||||||
|
|
||||||
|
|
||||||
// socket.Close();
|
// socket.Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ public class MonoNet {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
peers[i] = new Peer(id);
|
peers[i] = new Peer(id, SolidType.Immovable, Color.White * 0.5f);
|
||||||
index = i;
|
index = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -92,7 +92,7 @@ public class MonoNet {
|
||||||
peers[index].headset = ReadPose();
|
peers[index].headset = ReadPose();
|
||||||
peers[index].offHand = ReadPose();
|
peers[index].offHand = ReadPose();
|
||||||
peers[index].mainHand = ReadPose();
|
peers[index].mainHand = ReadPose();
|
||||||
ReadBlock(ref peers[index].block);
|
ReadBlock(ref peers[index].blocks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -110,13 +110,23 @@ public class MonoNet {
|
||||||
WritePose(me.headset);
|
WritePose(me.headset);
|
||||||
WritePose(me.offHand);
|
WritePose(me.offHand);
|
||||||
WritePose(me.mainHand);
|
WritePose(me.mainHand);
|
||||||
WriteBlock(me.block);
|
WriteBlock(me.blocks);
|
||||||
socket.Send(wData);
|
socket.Send(wData);
|
||||||
|
|
||||||
Thread.Sleep(60);
|
Thread.Sleep(60);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ReadBool() {
|
||||||
|
bool result = rData[rHead] == 1;
|
||||||
|
rHead++;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
void WriteBool(bool value) {
|
||||||
|
wData[wHead] = (byte)(value ? 1 : 0);
|
||||||
|
wHead++;
|
||||||
|
}
|
||||||
|
|
||||||
int ReadInt() {
|
int ReadInt() {
|
||||||
int value = BitConverter.ToInt32(rData, rHead);
|
int value = BitConverter.ToInt32(rData, rHead);
|
||||||
rHead += 4;
|
rHead += 4;
|
||||||
|
@ -182,18 +192,22 @@ public class MonoNet {
|
||||||
WriteQuat(pose.orientation);
|
WriteQuat(pose.orientation);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReadBlock(ref Block b) { // update instead of replace
|
void ReadBlock(ref Block[] blocks) {
|
||||||
Pose pose = ReadPose();
|
for (int i = 0; i < blocks.Length; i++) {
|
||||||
if (b == null) {
|
bool bActive = ReadBool();
|
||||||
b = new Block(pose.position, pose.orientation, SolidType.Immovable, Color.White * 0.5f); // read up on unaffected
|
Pose pose = ReadPose();
|
||||||
// b.solid.Enabled = false;
|
if (bActive) {
|
||||||
} else {
|
blocks[i].Enable(pose.position, pose.orientation);
|
||||||
b.solid.Teleport(pose.position, pose.orientation);
|
} else {
|
||||||
// b.solid.Enabled = false;
|
blocks[i].Disable();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void WriteBlock(Block block) {
|
void WriteBlock(Block[] blocks) {
|
||||||
WritePose(block.solid.GetPose());
|
for (int i = 0; i < blocks.Length; i++) {
|
||||||
|
WriteBool(blocks[i].active);
|
||||||
|
WritePose(blocks[i].solid.GetPose());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
string localIP, publicIP;
|
string localIP, publicIP;
|
||||||
|
@ -206,16 +220,11 @@ public class MonoNet {
|
||||||
publicIP = new WebClient().DownloadString("https://ipv4.icanhazip.com/").TrimEnd();
|
publicIP = new WebClient().DownloadString("https://ipv4.icanhazip.com/").TrimEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
Mesh meshCube = Default.MeshCube;
|
|
||||||
Material matCube = Default.Material;
|
|
||||||
public void Cubee(Matrix m) {
|
|
||||||
meshCube.Draw(matCube, m);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class Block {
|
public class Block {
|
||||||
public static Mesh mesh = Default.MeshCube;
|
public static Mesh mesh = Default.MeshCube;
|
||||||
public static Material mat = Default.Material;
|
public static Material mat = Default.Material;
|
||||||
|
|
||||||
|
public bool active = false;
|
||||||
public Solid solid;
|
public Solid solid;
|
||||||
|
|
||||||
public Color color;
|
public Color color;
|
||||||
|
@ -225,15 +234,34 @@ public class MonoNet {
|
||||||
// public int request; // request ownership
|
// public int request; // request ownership
|
||||||
// public int owner; // then if owner continue as usual
|
// public int owner; // then if owner continue as usual
|
||||||
// public bool busy; // marked as held so no fighting
|
// public bool busy; // marked as held so no fighting
|
||||||
|
public Block(SolidType type, Color color) {
|
||||||
public Block(Vec3 pos, Quat rot, SolidType type, Color color) {
|
this.solid = new Solid(Vec3.Zero, Quat.Identity, type);
|
||||||
this.solid = new Solid(pos, rot, type);
|
|
||||||
this.solid.AddBox(Vec3.One, 1);
|
this.solid.AddBox(Vec3.One, 1);
|
||||||
this.color = color;
|
this.color = color;
|
||||||
|
Disable();
|
||||||
|
}
|
||||||
|
|
||||||
|
// public Block(Vec3 pos, Quat rot, SolidType type, Color color) {
|
||||||
|
// this.solid = new Solid(pos, rot, type);
|
||||||
|
// this.solid.AddBox(Vec3.One, 1);
|
||||||
|
// this.color = color;
|
||||||
|
// }
|
||||||
|
|
||||||
|
public void Enable(Vec3 pos, Quat rot) {
|
||||||
|
solid.SetAngularVelocity(Vec3.Zero);
|
||||||
|
solid.SetVelocity(Vec3.Zero);
|
||||||
|
solid.Teleport(pos, rot);
|
||||||
|
solid.Enabled = active = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Disable() {
|
||||||
|
solid.Enabled = active = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Draw() {
|
public void Draw() {
|
||||||
mesh.Draw(mat, solid.GetPose().ToMatrix(), color);
|
if (active) {
|
||||||
|
mesh.Draw(mat, solid.GetPose().ToMatrix(), color);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,14 +279,82 @@ public class MonoNet {
|
||||||
public Pose headset;
|
public Pose headset;
|
||||||
public Pose offHand;
|
public Pose offHand;
|
||||||
public Pose mainHand;
|
public Pose mainHand;
|
||||||
public Block block;
|
public Block[] blocks;
|
||||||
// public Sound voice;
|
// public Sound voice;
|
||||||
// public SoundInst voiceInst; // update position
|
// public SoundInst voiceInst; // update position
|
||||||
|
|
||||||
public Peer(int id) {
|
public Peer(int id, SolidType type, Color color) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
|
blocks = new Block[] {
|
||||||
|
new Block(type, color),
|
||||||
|
new Block(type, color),
|
||||||
|
new Block(type, color)
|
||||||
|
};
|
||||||
// voice = Sound.CreateStream(0.5f);
|
// voice = Sound.CreateStream(0.5f);
|
||||||
// voiceInst = voice.Play(Vec3.Zero, 0.5f);
|
// voiceInst = voice.Play(Vec3.Zero, 0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int blockIndex = -1;
|
||||||
|
Vec3 blockOffset = Vec3.Zero;
|
||||||
|
public void Step(Controller domCon) {
|
||||||
|
if (domCon.IsX2JustPressed) {
|
||||||
|
if (blockIndex < 0) {
|
||||||
|
for (int i = 0; i < blocks.Length; i++) {
|
||||||
|
if (!blocks[i].active) {
|
||||||
|
blockIndex = i;
|
||||||
|
blocks[i].Enable(cursorA, Quat.Identity);
|
||||||
|
// blockOffset = blocks[i].solid.GetPose().position;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
blocks[blockIndex].Disable();
|
||||||
|
blockIndex = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (domCon.grip > 0.5f) {
|
||||||
|
if (blockIndex < 0) {
|
||||||
|
for (int i = 0; i < blocks.Length; i++) {
|
||||||
|
Pose blockPose = blocks[i].solid.GetPose();
|
||||||
|
Bounds bounds = new Bounds(Vec3.Zero, Vec3.One);
|
||||||
|
if (blocks[i].active && bounds.Contains(blockPose.orientation.Inverse * (cursorA - blockPose.position))) {
|
||||||
|
blockOffset = cursorA - blockPose.position;
|
||||||
|
// block.color = colorCube.color;
|
||||||
|
blockIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (blockIndex >= 0) {
|
||||||
|
// trackballer
|
||||||
|
blocks[blockIndex].solid.Move(cursorA - blockOffset, blocks[blockIndex].solid.GetPose().orientation);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
blockIndex = -1;
|
||||||
|
}
|
||||||
|
Draw(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Draw(bool body) {
|
||||||
|
if (body){
|
||||||
|
Cube(Matrix.TRS(cursorA, Quat.Identity, Vec3.One * 0.05f));
|
||||||
|
Cube(headset.ToMatrix(Vec3.One * 0.3f));
|
||||||
|
Cube(offHand.ToMatrix(Vec3.One * 0.1f));
|
||||||
|
Cube(mainHand.ToMatrix(Vec3.One * 0.1f));
|
||||||
|
}
|
||||||
|
// cubicFlow.Draw(peer.cursorA, peer.cursorB, peer.cursorC, peer.cursorD);
|
||||||
|
|
||||||
|
for (int i = 0; i < blocks.Length; i++) {
|
||||||
|
blocks[i].Draw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Mesh meshCube = Default.MeshCube;
|
||||||
|
static Material matCube = Default.Material;
|
||||||
|
public void Cube(Matrix m) {
|
||||||
|
meshCube.Draw(matCube, m);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
34
Program.cs
34
Program.cs
|
@ -40,9 +40,6 @@ public class Mono {
|
||||||
Oriel oriel = new Oriel();
|
Oriel oriel = new Oriel();
|
||||||
oriel.Start();
|
oriel.Start();
|
||||||
|
|
||||||
// int blockIndex = -1;
|
|
||||||
// Vec3 blockOffset = Vec3.Zero;
|
|
||||||
|
|
||||||
MonoNet net = new MonoNet(this);
|
MonoNet net = new MonoNet(this);
|
||||||
net.Start();
|
net.Start();
|
||||||
|
|
||||||
|
@ -129,31 +126,11 @@ public class Mono {
|
||||||
|
|
||||||
// how to extend the buttons!!! as we only have 2 T-T
|
// how to extend the buttons!!! as we only have 2 T-T
|
||||||
|
|
||||||
// BLOCKS
|
|
||||||
// Solid solid = new Solid(Vec3.Up * -2, Quat.Identity, SolidType.Immovable);
|
|
||||||
// make some blocks you can move around with cursor.p0
|
|
||||||
// no collision detection, just a visual example
|
|
||||||
// if (domCon.grip > 0.5f) {
|
|
||||||
// if (blockIndex < 0) {
|
|
||||||
// for (int i = 0; i < net.me.blocks.Length; i++) {
|
|
||||||
// if (net.me.blocks[i].bounds.Contains(cursor.p0)) {
|
|
||||||
// blockIndex = i;
|
|
||||||
// blockOffset = cursor.p0 - net.me.blocks[i].bounds.center;
|
|
||||||
// net.me.blocks[i].color = colorCube.color;
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// net.me.blocks[blockIndex].bounds.center = cursor.p0 - blockOffset;
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// blockIndex = -1;
|
|
||||||
// }
|
|
||||||
cube.Draw(mat, floor.GetPose().ToMatrix(floorScale));
|
cube.Draw(mat, floor.GetPose().ToMatrix(floorScale));
|
||||||
// for (int i = 0; i < net.me.blocks.Length; i++) {
|
// for (int i = 0; i < net.me.blocks.Length; i++) {
|
||||||
// cube.Draw(mat, net.me.blocks[i].solid.GetPose().ToMatrix(), net.me.blocks[i].color);
|
// cube.Draw(mat, net.me.blocks[i].solid.GetPose().ToMatrix(), net.me.blocks[i].color);
|
||||||
// }
|
// }
|
||||||
net.me.block.Draw();
|
|
||||||
|
|
||||||
// cursor.Step(lHand.aim, rHand.aim); cursor.DrawSelf();
|
// cursor.Step(lHand.aim, rHand.aim); cursor.DrawSelf();
|
||||||
// net.me.cursorA = Vec3.Up * (float)Math.Sin(Time.Total);
|
// net.me.cursorA = Vec3.Up * (float)Math.Sin(Time.Total);
|
||||||
|
@ -164,15 +141,12 @@ public class Mono {
|
||||||
for (int i = 0; i < net.peers.Length; i++) {
|
for (int i = 0; i < net.peers.Length; i++) {
|
||||||
MonoNet.Peer peer = net.peers[i];
|
MonoNet.Peer peer = net.peers[i];
|
||||||
if (peer != null) {
|
if (peer != null) {
|
||||||
net.Cubee(Matrix.TRS(peer.cursorA, Quat.Identity, Vec3.One * 0.05f));
|
peer.Draw(true);
|
||||||
net.Cubee(peer.headset.ToMatrix(Vec3.One * 0.3f));
|
|
||||||
net.Cubee(peer.offHand.ToMatrix(Vec3.One * 0.1f));
|
|
||||||
net.Cubee(peer.mainHand.ToMatrix(Vec3.One * 0.1f));
|
|
||||||
// cubicFlow.Draw(peer.cursorA, peer.cursorB, peer.cursorC, peer.cursorD);
|
|
||||||
if (peer.block != null){ peer.block.Draw(); }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
net.me.Step(domCon);
|
||||||
|
|
||||||
// oriel.Step();
|
// oriel.Step();
|
||||||
|
|
||||||
// Matrix orbitMatrix = OrbitalView.transform;
|
// Matrix orbitMatrix = OrbitalView.transform;
|
||||||
|
|
Loading…
Add table
Reference in a new issue