Cauldron3D.Net shows 3D scenes in the browser. A scene server takes the same changes
CauldronGPU.submit/2 takes and keeps the scene. It broadcasts each tick as
CauldronGPU.Stream bytes over a Phoenix channel. In the browser, cauldron3d.js draws
them with three.js.
defmodule MyGame.Web.SceneSocket do
use Cauldron3D.Net.Socket, channel: MyGame.Web.SceneChannel
end
defmodule MyGame.Web.SceneChannel do
use Cauldron3D.Net.Channel
end
defmodule MyGame.Web.Endpoint do
use Phoenix.Endpoint, otp_app: :my_game
socket "/socket", MyGame.Web.SceneSocket, websocket: true, longpoll: false
plug Cauldron3D.Net.Page, scene: "courtyard"
end
{:ok, scene} = Cauldron3D.Net.Scene.open(id: "courtyard", events: self())
cube = Cauldron3D.Net.Scene.mesh(scene, CauldronGPU.Mesh.cube(1.0))
Cauldron3D.Net.Scene.submit(scene, [{:instance, 1, %CauldronGPU.Instance{mesh: cube}}])Cauldron3D.Net.Scene.open/1 starts a scene linked to the caller; under a supervisor use
start_link/1 and find the scene with Cauldron3D.Net.Scene.lookup/1. A scene is a
CauldronGPU.Target, so the cauldron_gpu converters (CauldronGPU.Bsp.upload/4 and the
rest) and any code written against CauldronGPU.Target upload to it as to a renderer.
A browser joining late gets the whole scene, then every tick. Its keyboard, mouse,
resize and focus events reach the :events pid as
{:cauldron_3d_net, scene_id, session, event}, in the shapes CauldronGPU's windows send.
Installation
def deps do
[
{:cauldron_3d_net, "~> 0.3"},
{:bandit, "~> 1.5"}
]
endYour endpoint needs pubsub_server: Cauldron3D.Net.PubSub (the package starts it) and a
web server adapter such as Bandit. The page loads three.js from jsDelivr, so the browser
needs to reach it.
Examples
mix run examples/showcase.exsserves the cauldron_gpu showcase at http://localhost:4400/; arrow keys or W A S D in the browser move the camera.mix run examples/quake_map.exs ~/quake e1m1serves a Quake map with its sky.
What the browser draws
The browser draws what WebGL 2 can:
- physically based materials, with vertex colours, add and multiply blending, scrolling,
reflection-mapped and rippling textures, and the shimmer (
smear) - point, spot and directional lights, and the directional light's shadows
- fog, the sky and sky pictures, and coloured light styles
- the overlay and screen tint, bloom and tone mapping
- 2D layers: sprites and column layers into the frame or into canvases, over the 3D scene or alone when no camera has been sent
- display-space lighting with light tables, gamma, contrast and brightness
- camera viewports and low-detail resolution
- swelling shells, and instances drawn in front, without the depth test or standing in a room
- poses, blended and skinned on the browser's CPU, and interpolation between ticks
Its bloom is stronger than the native renderer's. The browser ignores ray-traced effects, upscaling and frame generation.