kopia lustrzana https://github.com/jameshball/osci-render
Setup basic server and client for transmitting object data to osci-render from blender
rodzic
06aced58f4
commit
19c650cf16
|
@ -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)
|
6
pom.xml
6
pom.xml
|
@ -170,6 +170,12 @@
|
||||||
<artifactId>aparapi</artifactId>
|
<artifactId>aparapi</artifactId>
|
||||||
<version>3.0.0</version>
|
<version>3.0.0</version>
|
||||||
</dependency>
|
</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>
|
</dependencies>
|
||||||
<profiles>
|
<profiles>
|
||||||
|
|
|
@ -8,9 +8,7 @@ import sh.ball.shapes.Shape;
|
||||||
import sh.ball.shapes.Vector2;
|
import sh.ball.shapes.Vector2;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
|
||||||
|
|
||||||
public class CameraDrawKernel extends Kernel {
|
public class CameraDrawKernel extends Kernel {
|
||||||
|
|
||||||
|
|
|
@ -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) +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -24,6 +24,15 @@ public class WorldObject {
|
||||||
private Vector3 rotation;
|
private Vector3 rotation;
|
||||||
private boolean hideEdges = false;
|
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,
|
private WorldObject(List<Vector3> objVertices, List<List<Vector3>> vertexPath, Vector3 position,
|
||||||
Vector3 rotation) {
|
Vector3 rotation) {
|
||||||
this.objVertices = objVertices;
|
this.objVertices = objVertices;
|
||||||
|
|
|
@ -48,6 +48,7 @@ import sh.ball.audio.engine.AudioInputListener;
|
||||||
import sh.ball.audio.engine.JavaAudioInput;
|
import sh.ball.audio.engine.JavaAudioInput;
|
||||||
import sh.ball.audio.midi.MidiListener;
|
import sh.ball.audio.midi.MidiListener;
|
||||||
import sh.ball.audio.midi.MidiNote;
|
import sh.ball.audio.midi.MidiNote;
|
||||||
|
import sh.ball.engine.ObjectServer;
|
||||||
import sh.ball.gui.Gui;
|
import sh.ball.gui.Gui;
|
||||||
import sh.ball.parser.obj.ObjFrameSettings;
|
import sh.ball.parser.obj.ObjFrameSettings;
|
||||||
import sh.ball.parser.obj.ObjParser;
|
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
|
// used when a file is chosen so that the same folder is reopened when a
|
||||||
|
|
Ładowanie…
Reference in New Issue