I've tested a splitscreen approach with one window subdivided into two viewports. It's a "bit" ugly...
So the idea is the following. Create three cameras for two viewports. The second camera will render the left viewport, the third camera the right viewport. These two cameras render into special texture resources which will be rendered by the first camera using overlays.
This solution is probably far from being optimal...
add resource function:
Code:
self._h3dres.splitscreen1 = h3d.createTexture2D('splitscreen-1', 0, 400, 600, True)
self._h3dres.splitscreen2 = h3d.createTexture2D('splitscreen-2', 0, 400, 600, True)
self._h3dres.splitscreen1Mat = h3d.addResource(h3d.ResourceTypes.Material, 'splitscreen1.material.xml', 0)
self._h3dres.splitscreen1Mat = h3d.addResource(h3d.ResourceTypes.Material, 'splitscreen2.material.xml', 0)
splitscreenN.material.xml (with N=1,2):
Code:
<Material>
<Shader source="overlay.shader.xml"/>
<TexUnit unit="0" map="splitscreen-N" />
</Material>
The map name must be the name of the texture resource above. It would probably be better to generate this file inside your program to allow any number of viewports without having to create these files.
setup camera:
Code:
self.camera = h3d.addCameraNode(h3d.RootNode, name, pipeRes) # renders complete window
h3d.setNodeTransform(self.camera, 0, 0, -100, 0, 0, 0, 1, 1, 1)
self.camera1 = h3d.addCameraNode(h3d.RootNode, '%s-1' % name, pipeRes) # left view
h3d.setNodeTransform(self.camera1, 0, 0, -100, 0, 0, 0, 1, 1, 1)
h3d.setNodeParami(self.camera1, h3d.CameraNodeParams.OutputTex, self._app._h3dres.splitscreen1)
h3d.setupCameraView(self.camera1, 45, 400 / 600.0, 0.1, 1000)
self.camera2 = h3d.addCameraNode(h3d.RootNode, '%s-2' % name, pipeRes) # right view
h3d.setNodeTransform(self.camera2, 0, 0, -100, 0, 0, 0, 1, 1, 1)
h3d.setNodeParami(self.camera2, h3d.CameraNodeParams.OutputTex, self._app._h3dres.splitscreen2)
h3d.setupCameraView(self.camera2, 45, 400 / 600.0, 0.1, 1000)
rendering:
Code:
h3d.utils.showText('%s' % (self._fpsString), 0, 0.95, 0.03, 0, self._h3dres.fontMaterial) # only on left split screen
h3d.showOverlay(0.75, 0, 0, 0, 1, 0, 1, 0, 1, 0.2, 1, 1, 0.75, 0.2, 0, 1, 7, self._h3dres.logoMaterial)
h3d.render(w.camera1)
h3d.clearOverlays()
h3d.showOverlay(0.75, 0, 0, 0, 1, 0, 1, 0, 1, 0.2, 1, 1, 0.75, 0.2, 0, 1, 7, self._h3dres.logoMaterial)
h3d.render(w.camera2)
h3d.clearOverlays()
h3d.showOverlay(
# x y u v
0, 0, 0, 0, # lower left
0.5, 0, 1, 0, # lower right
0.5, 1, 1, 1, # upper right
0, 1, 0, 1, # upper left
6,
self._h3dres.splitscreen1Mat)
h3d.showOverlay(
# x y u v
0.5 + 0, 0, 0, 0, # lower left
0.5 + 0.5, 0, 1, 0, # lower right
0.5 + 0.5, 1, 1, 1, # upper right
0.5 + 0, 1, 0, 1, # upper left
6,
self._h3dres.splitscreen2Mat)
h3d.render(w.camera)
h3d.clearOverlays()