Setup basic server and client for transmitting object data to osci-render from blender

pull/54/head
James Ball 2022-04-18 21:03:23 +01:00
rodzic 06aced58f4
commit 19c650cf16
6 zmienionych plików z 145 dodań i 2 usunięć

62
blender/plugin.py 100644
Wyświetl plik

@ -0,0 +1,62 @@
import bpy
import bmesh
import socket
import json
HOST = "localhost"
PORT = 51677
# Persistent global storage for knowing which meshes
# have already been sent to osci-render
bpy.context.scene.collection["osci_render"] = {}
col = bpy.context.scene.collection["osci_render"]
col["seen_objs"] = {}
camera = bpy.context.scene.camera
def my_osci_render_func(scene):
engine_info = {"objects": []}
for obj in bpy.data.objects:
if obj.type == 'MESH':
object_info = {"name": obj.name}
if obj.name not in col["seen_objs"]:
col["seen_objs"][obj.name] = 1
print("new object! ", obj.name)
mesh = bmesh.new()
mesh.from_mesh(obj.data)
object_info["vertices"] = []
# If there are bugs, the vertices here might not match up with the vert.index in edges
for vert in mesh.verts:
object_info["vertices"].append({
"x": vert.co[0],
"y": vert.co[1],
"z": vert.co[2],
})
object_info["edges"] = []
for edge in mesh.edges:
for vert in edge.verts:
object_info["edges"].append(vert.index)
camera_space = camera.matrix_world.inverted() @ obj.matrix_world
object_info["matrix"] = []
for i in range(4):
for j in range(4):
object_info["matrix"].append(camera_space[i][j])
engine_info["objects"].append(object_info)
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((HOST, PORT))
sock.sendall(json.dumps(engine_info, separators=(',', ':')).encode('utf-8'))
sock.close()
bpy.app.handlers.frame_change_pre.clear()
bpy.app.handlers.frame_change_pre.append(my_osci_render_func)

Wyświetl plik

@ -170,6 +170,12 @@
<artifactId>aparapi</artifactId>
<version>3.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
<profiles>

Wyświetl plik

@ -8,9 +8,7 @@ import sh.ball.shapes.Shape;
import sh.ball.shapes.Vector2;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class CameraDrawKernel extends Kernel {

Wyświetl plik

@ -0,0 +1,65 @@
package sh.ball.engine;
import com.google.gson.Gson;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
public class ObjectServer implements Runnable {
private static final int PORT = 51677;
private final Gson gson = new Gson();
@Override
public void run() {
try {
ServerSocket Server = new ServerSocket(PORT);
while (true) {
System.out.println("Waiting for connection");
Socket socket = Server.accept();
BufferedReader clientReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String json = clientReader.readLine();
System.out.println(json);
EngineInfo info = gson.fromJson(json, EngineInfo.class);
System.out.println(info);
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static class EngineInfo {
private ObjectInfo[] objects;
@Override
public String toString() {
return "EngineInfo{" +
"objects=" + Arrays.toString(objects) +
'}';
}
}
private static class ObjectInfo {
private String name;
private Vector3[] vertices;
private int[] edges;
// Camera space matrix
private float[] matrix;
@Override
public String toString() {
return "ObjectInfo{" +
"name='" + name + '\'' +
", vertices=" + Arrays.toString(vertices) +
", edges=" + Arrays.toString(edges) +
", matrix=" + Arrays.toString(matrix) +
'}';
}
}
}

Wyświetl plik

@ -24,6 +24,15 @@ public class WorldObject {
private Vector3 rotation;
private boolean hideEdges = false;
private WorldObject(Vector3[] vertices, int[] edgeIndices) {
objVertices = Arrays.stream(vertices).toList();
Set<Line3D> edges = new HashSet<>();
for (int i = 0; i < edgeIndices.length; i += 2) {
edges.add(new Line3D(vertices[i], vertices[i + 1]));
}
getDrawPath(edges);
}
private WorldObject(List<Vector3> objVertices, List<List<Vector3>> vertexPath, Vector3 position,
Vector3 rotation) {
this.objVertices = objVertices;

Wyświetl plik

@ -48,6 +48,7 @@ import sh.ball.audio.engine.AudioInputListener;
import sh.ball.audio.engine.JavaAudioInput;
import sh.ball.audio.midi.MidiListener;
import sh.ball.audio.midi.MidiNote;
import sh.ball.engine.ObjectServer;
import sh.ball.gui.Gui;
import sh.ball.parser.obj.ObjFrameSettings;
import sh.ball.parser.obj.ObjParser;
@ -450,6 +451,8 @@ public class MainController implements Initializable, FrequencyListener, MidiLis
}
}
}
new Thread(new ObjectServer()).start();
}
// used when a file is chosen so that the same folder is reopened when a