Skip to content

Commit 15572fb

Browse files
committed
Working camera bg - but hacky
1 parent 04fa2b1 commit 15572fb

File tree

3 files changed

+93
-2
lines changed

3 files changed

+93
-2
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
__pycache__
2+
*.pnm

base.py

+21-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from direct.interval.IntervalGlobal import Sequence
2929

3030
from util3d.cube import makeCube
31+
from util3d.cameratex import CameraTexture, CameraCard
3132

3233
if "help" in sys.argv:
3334
print("""Command Line Arguments:
@@ -190,6 +191,12 @@ def __init__(self):
190191

191192
self.textNp = self.render.attachNewNode("TextNodes")
192193

194+
self.updateCamera = True
195+
self.cameraCard = CameraCard(self.render)
196+
self.cameraCard.setScale(Vec3(-16, 1, 9) * 4)
197+
self.cameraCard.setTwoSided(True)
198+
self.cameraCard.setPos((8 * 4, 22, -4.5 * 4))
199+
193200
light = makeLight(1)
194201
lightNp = render.attachNewNode(light)
195202
lightNp.setPos(24, -30, 12)
@@ -229,6 +236,7 @@ def __init__(self):
229236
self.accept('c', self.oobe)
230237
self.accept('g', self.toggleGravity)
231238
self.accept('p', self.pause)
239+
self.accept('b', self.toggleCameraBg)
232240

233241
def debugNodes(self):
234242
print("\n".join(["{}\tGravity: {}\tLinear: {}\tAngular: {}".format(
@@ -258,10 +266,17 @@ def toggleGravity(self):
258266
self.world.setGravity((0, 0, 5))
259267
print("New Gravity: ", self.world.getGravity())
260268

269+
def toggleCameraBg(self):
270+
if self.cameraCard.parent:
271+
self.cameraCard.detachNode()
272+
else:
273+
self.cameraCard.reparentTo(self.render)
274+
261275
def update(self, task):
262276
msg = self.queue.get()
263277
processed = 0
264278
while msg:
279+
print(msg)
265280
if msg["action"] == "leave":
266281
self.launchers[msg["client_id"]].destroy()
267282
del self.launchers[msg["client_id"]]
@@ -276,6 +291,9 @@ def update(self, task):
276291
else:
277292
msg = None
278293

294+
self.updateCamera = not self.updateCamera
295+
self.updateCamera and self.cameraCard.update()
296+
279297
dt = globalClock.getDt()
280298
if not self.paused:
281299
self.world.doPhysics(dt)
@@ -349,5 +367,6 @@ def addText(self, value, pos=Point3(0, 0, 0)):
349367
text.setPos(pos)
350368
return text
351369

352-
app = TextApp()
353-
app.run()
370+
if __name__ == "__main__":
371+
app = TextApp()
372+
app.run()

util3d/cameratex.py

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import cv2
2+
import io
3+
import os
4+
import time
5+
import sys
6+
7+
from redis import Redis
8+
9+
from panda3d.core import CardMaker, Texture, PNMImage
10+
11+
from direct.stdpy import threading, thread
12+
13+
PIPE_FILE = "panda_camera_pipe.pnm"
14+
15+
class CameraReader:
16+
def __init__(self, index=1, pipe=PIPE_FILE):
17+
self.cap = cv2.VideoCapture(index)
18+
self.pipe = pipe
19+
self.redis = Redis()
20+
self.redis.delete("camera-lock")
21+
22+
def getFrame(self):
23+
ret, frame = self.cap.read()
24+
25+
if ret:
26+
with self.redis.lock("camera-lock"):
27+
return cv2.imwrite(self.pipe, frame)
28+
return ret
29+
30+
class CameraTexture:
31+
def __init__(self, pipe=PIPE_FILE):
32+
self.tex = Texture("CameraTexture")
33+
self.pipe = pipe
34+
self.redis = Redis()
35+
self.redis.delete("camera-lock")
36+
self.image = None
37+
self.thread = thread.start_new_thread(self.readImage, ())
38+
39+
def readImage(self):
40+
while True:
41+
with self.redis.lock("camera-lock"):
42+
newImage = PNMImage(self.pipe)
43+
self.image = newImage
44+
time.sleep(0.06)
45+
46+
def update(self):
47+
if self.image:
48+
self.tex.load(self.image)
49+
50+
def getTexture(self):
51+
return self.tex
52+
53+
class CameraCard:
54+
def __init__(self, parent):
55+
self.tex = CameraTexture()
56+
cm = CardMaker("CameraCard")
57+
self.cardNp = parent.attachNewNode(cm.generate())
58+
self.cardNp.setTexture(self.tex.getTexture())
59+
60+
def __getattr__(self, name):
61+
return getattr(self.cardNp, name)
62+
63+
def update(self):
64+
return self.tex.update()
65+
66+
if __name__ == "__main__":
67+
camera = CameraReader(int(sys.argv[1]) if len(sys.argv) > 1 else 1)
68+
while True:
69+
ret = camera.getFrame()
70+
print(time.time())
71+
time.sleep(0.05)

0 commit comments

Comments
 (0)