Kiss3d - Keep it simple, stupid 3d graphics engine for Rust.

Last update: Jun 20, 2022

Kiss3d

Keep It Simple, Stupid 3d graphics engine.

This library is born from the frustration that today’s 3D graphics library are either:

  • Too low level: you have to write your own shaders and opening a window takes 8 hours, 300 lines of code and 10L of coffee.
  • High level, but too hard to understand/use: these libraries are made to create beautiful photoreal (or close to it) animations or games. They have many features; too many, in fact, if you just want to draw a few objects on the screen with as little friction as possible.

kiss3d is not designed to be feature-complete or fast. It is designed to let you draw simple geometric figures and play with them with as little friction as possible.

An online version of this documentation is available here.

Features

  • WASM compatible.
  • Out of the box, open a window with a default arc-ball camera and a point light.
  • First-person camera available as well, and user-defined cameras are possible.
  • Render boxes, spheres, cones, cylinders, quads and lines simply
  • Change an object's color or texture.
  • Change an object's transform (we use nalgebra to do that).
  • Create basic post-processing effects.

As an example, creating a scene with a red, rotating cube with a light attached to the camera is as simple as (NOTE: this will not compile when targeting WASM):

extern crate kiss3d;
extern crate nalgebra as na;

use na::{Vector3, UnitQuaternion};
use kiss3d::window::Window;
use kiss3d::light::Light;

fn main() {
    let mut window = Window::new("Kiss3d: cube");
    let mut c      = window.add_cube(1.0, 1.0, 1.0);

    c.set_color(1.0, 0.0, 0.0);

    window.set_light(Light::StickToCamera);

    let rot = UnitQuaternion::from_axis_angle(&Vector3::y_axis(), 0.014);

    while window.render() {
        c.prepend_to_local_rotation(&rot);
    }
}

Making the same example compatible with both WASM and native platforms is slightly more complicated because kiss3d must control the render loop:

extern crate kiss3d;
extern crate nalgebra as na;

use kiss3d::light::Light;
use kiss3d::scene::SceneNode;
use kiss3d::window::{State, Window};
use na::{UnitQuaternion, Vector3};

struct AppState {
    c: SceneNode,
    rot: UnitQuaternion<f32>,
}

impl State for AppState {
    fn step(&mut self, _: &mut Window) {
        self.c.prepend_to_local_rotation(&self.rot)
    }
}

fn main() {
    let mut window = Window::new("Kiss3d: wasm example");
    let mut c = window.add_cube(1.0, 1.0, 1.0);

    c.set_color(1.0, 0.0, 0.0);

    window.set_light(Light::StickToCamera);

    let rot = UnitQuaternion::from_axis_angle(&Vector3::y_axis(), 0.014);
    let state = AppState { c, rot };

    window.render_loop(state)
}

Some controls are handled by default by the engine (they can be overridden by the user):

  • scroll: zoom in / zoom out.
  • left click + drag: look around.
  • right click + drag: translate the view point.
  • enter: look at the origin (0.0, 0.0, 0.0).

Compilation

You will need the last stable build of the rust compiler and the official package manager: cargo.

Simply add the following to your Cargo.toml file:

[dependencies]
kiss3d = "0.29"

Contributions

I’d love to see people improving this library for their own needs. However, keep in mind that kiss3d is KISS. One-liner features (from the user point of view) are preferred.

Acknowledgements

Thanks to all the Rustaceans for their help, and their OpenGL bindings.

GitHub

https://github.com/sebcrozet/kiss3d
Comments
  • 1. Can't build with rust 0.10

    Hi, I'm using the last stable rust release and getting this error after make:

    > make
    mkdir -p lib
    rustc src/lib.rs --opt-level 3 --out-dir lib -Llib/glfw-rs/lib -Llib/gl-rs -Llib/nalgebra/lib -Llib/rust-stb-image/ -Llib/rust-freetype/
    src/lib.rs:103:1: 103:19 error: can't find crate for `libc`
    src/lib.rs:103 extern crate libc;
                   ^~~~~~~~~~~~~~~~~~
    error: aborting due to previous error
    make: *** [all] Error 101
    
    > rustc -v
    rustc 0.10 (46867cc 2014-04-02 16:59:39 -0700)
    host: i686-apple-darwin
    
    Reviewed by shirokoff at 2014-04-07 17:16
  • 2. Bump nalgebra to a safe version

    Hey,

    This bumps version of nalgebra to new version which should be safe from https://github.com/dimforge/nalgebra/issues/883

    I noticed issue mentioning that you don't have time to actively maintain this crate anymore so I figured I might save you some by just creating this PR myself even when it's a simple one.

    I also saw that https://github.com/sebcrozet/kiss3d/pull/280 exists but it seems that it missed updating the dev-dependencies

    Testing

    Since this crate doesn't have many tests I tested it by running the examples to make sure they work. I did this on a linux machine but I think it's pretty safe to assume that it doesn't break anything on other platforms.

    Reviewed by dmweis at 2021-06-11 23:09
  • 3. Improve webgl_canvas mouse event handling and fix mouse coordinates

    A previous version of this PR narrowed the event listeners target, introduced the use of pointer events to enable pointer capturing via setPointerCapture and added some cleanup code. Following the comments, part of this PR was split into another PR #219. The current PR focuses on improving the mouse event handling without using pointer event.

    Reviewed by alvinhochun at 2020-02-24 17:48
  • 4. 0.28.0 broken on macOS

       Compiling kiss3d v0.28.0
    error[E0432]: unresolved import `glutin::platform::unix`
      --> /Users/moritz/.cargo/registry/src/github.com-1ecc6299db9ec823/kiss3d-0.28.0/src/window/gl_canvas.rs:40:35
       |
    40 |             use glutin::platform::unix::EventLoopExtUnix;
       |                                   ^^^^ could not find `unix` in `platform`
    
    error[E0599]: no function or associated item named `new_any_thread` found for struct `EventLoop<_>` in the current scope
      --> /Users/moritz/.cargo/registry/src/github.com-1ecc6299db9ec823/kiss3d-0.28.0/src/window/gl_canvas.rs:41:24
       |
    41 |             EventLoop::new_any_thread()
       |                        ^^^^^^^^^^^^^^ function or associated item not found in `EventLoop<_>`
    
    error[E0308]: mismatched types
      --> /Users/moritz/.cargo/registry/src/github.com-1ecc6299db9ec823/kiss3d-0.28.0/src/window/gl_canvas.rs:79:13
       |
    79 |             events,
       |             ^^^^^^ expected struct `EventLoop`, found struct `EventLoopWindowTarget`
       |
       = note: expected struct `EventLoop<()>`
                  found struct `EventLoopWindowTarget<_>`
    
    error: aborting due to 3 previous errors
    
    Reviewed by virtualritz at 2020-11-27 18:28
  • 5. Switch to web-sys instead of stdweb.

    It appears that stdweb is mostly dead so I would like to switch to web-sys/wasm-bindgen instead. This is a breaking change because:

    • This completely removes the stdweb dependency in favor of web-sys.
    • This uses glow instead of our generated webgl/opengl bindings.
    Reviewed by sebcrozet at 2020-08-12 17:59
  • 6. Proof-of-concept of splitting Conrod UI into separate crate

    I tried adding hooks for GUI support and splitting the Conrod UI integration code into a separate crate. The idea is that it might allow integration with other UI libraries to be written and that they can be conveniently plugged in. Here is a proof-of-concept.

    • I added a trait window::UiContext which replaces the existing ConrodContext struct inside kiss3d.
    • The actual Conrod code (including the ConrodContext struct and conrod_renderer) are moved to a separate crate kiss3d_conrod
      • This has the same name as the previously-vendored conrod_core crate. I figured that since it is no longer needed, perhaps the name can be reused?
    • In the non-generic version the UI as a field in Window has the type Option<Rc<RefCell<dyn UiContext>>>. ~~I have tried to make it the UiContext a generic parameter of Window (with a dummy context as default), but the generic parameter would leak into window::State~~ This is what it would look like if a generic parameter is used and I am not sure if it is really a good idea. What is your opinion @sebcrozet?

    Run cargo run -p kiss3d_conrod --example ui to run the example.

    (I might want to try implementing a UI integration with iced using this as a basis.)

    Reviewed by alvinhochun at 2020-07-16 16:43
  • 7. window.rs:327:38: 327:67 error: mismatched types: expected `*const std::os::raw::c_void`, found `*const libc::c_void`

    When attempting to build the readme sample (and installing opengl freeglut3-dev, and randr xorg-dev libglu1-mesa-dev) I'm getting this:

    Executing: cargo build 
       Compiling kiss3d v0.1.4 (https://github.com/sebcrozet/kiss3d#98f00870)
    ~/.cargo/git/checkouts/kiss3d-fdfcc5cc23d2dd9f/master/src/window/window.rs:327:38: 327:67 error: mismatched types:
     expected `*const std::os::raw::c_void`,
        found `*const libc::c_void`
    (expected enum `std::os::raw::c_void`,
        found enum `libc::c_void`) [E0308]
    ~/.cargo/git/checkouts/kiss3d-fdfcc5cc23d2dd9f/master/src/window/window.rs:327         verify!(gl::load_with(|name| window.get_proc_address(name)));
                                                                                                                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ~/.cargo/git/checkouts/kiss3d-fdfcc5cc23d2dd9f/master/src/window/window.rs:327:9: 327:70 note: in this expansion of verify! (defined in ~/.cargo/git/checkouts/kiss3d-fdfcc5cc23d2dd9f/master/src/error.rs)
    ~/.cargo/git/checkouts/kiss3d-fdfcc5cc23d2dd9f/master/src/window/window.rs:327:38: 327:67 help: run `rustc --explain E0308` to see a detailed explanation
    error: aborting due to previous error
    Could not compile `kiss3d`.
    

    The readme says that the latest nightlies of rust are required, but that was edited a long time ago so is that still necessary?

    Reviewed by MrAndMrsK at 2015-11-26 18:38
  • 8. Changing rotation (i.e. up-vector) of camera?

    I cannot for the life of me figure out how to change the rotation of the camera. By rotation I mean rotation with respect to the direction the camera is pointing, i.e. changing the up vector, or, I think, the "roll" of the camera. Am I simply looking in the wrong places?

    Reviewed by Andlon at 2018-08-23 08:02
  • 9. Linker error on OS X

    dev ➤ git clone --recursive git://github.com/sebcrozet/kiss3d.git
    Cloning into 'kiss3d'...
    remote: Reusing existing pack: 3137, done.
    remote: Counting objects: 261, done.
    remote: Compressing objects: 100% (256/256), done.
    remote: Total 3398 (delta 160), reused 0 (delta 0)
    Receiving objects: 100% (3398/3398), 2.45 MiB | 857.00 KiB/s, done.
    Resolving deltas: 100% (2306/2306), done.
    Checking connectivity... done.
    Submodule 'lib/gl-rs' (git://github.com/sebcrozet/gl-rs.git) registered for path 'lib/gl-rs'
    Submodule 'lib/glfw-rs' (https://github.com/sebcrozet/glfw-rs.git) registered for path 'lib/glfw-rs'
    Submodule 'lib/nalgebra' (https://github.com/sebcrozet/nalgebra.git) registered for path 'lib/nalgebra'
    Submodule 'lib/ncollide' (git://github.com/sebcrozet/ncollide.git) registered for path 'lib/ncollide'
    Submodule 'lib/rust-ffmpeg' (git://github.com/sebcrozet/rust-ffmpeg.git) registered for path 'lib/rust-ffmpeg'
    Submodule 'lib/rust-freetype' (git://github.com/sebcrozet/rust-freetype.git) registered for path 'lib/rust-freetype'
    Submodule 'lib/rust-stb-image' (https://github.com/sebcrozet/rust-stb-image.git) registered for path 'lib/rust-stb-image'
    Cloning into 'lib/gl-rs'...
    remote: Reusing existing pack: 938, done.
    remote: Counting objects: 55, done.
    remote: Compressing objects: 100% (41/41), done.
    remote: Total 993 (delta 18), reused 31 (delta 7)
    Receiving objects: 100% (993/993), 1.88 MiB | 876.00 KiB/s, done.
    Resolving deltas: 100% (429/429), done.
    Checking connectivity... done.
    Submodule path 'lib/gl-rs': checked out '708ba0dc29738e7dd95fb93a40a0f5ed4e3a91c9'
    Submodule 'deps/glfw-rs' (https://github.com/bjz/glfw-rs.git) registered for path 'deps/glfw-rs'
    Submodule 'deps/khronos-api' (https://github.com/bjz/khronos-api.git) registered for path 'deps/khronos-api'
    Submodule 'deps/sax-rs' (https://github.com/bjz/sax-rs.git) registered for path 'deps/sax-rs'
    Cloning into 'deps/glfw-rs'...
    remote: Reusing existing pack: 3266, done.
    remote: Counting objects: 17, done.
    remote: Compressing objects: 100% (17/17), done.
    remote: Total 3283 (delta 1), reused 0 (delta 0)
    Receiving objects: 100% (3283/3283), 906.46 KiB | 819.00 KiB/s, done.
    Resolving deltas: 100% (1683/1683), done.
    Checking connectivity... done.
    Submodule path 'lib/gl-rs/deps/glfw-rs': checked out '61518cbd524d33411622c86352e9b4343b4fee90'
    Cloning into 'deps/khronos-api'...
    remote: Reusing existing pack: 1272, done.
    remote: Total 1272 (delta 0), reused 0 (delta 0)
    Receiving objects: 100% (1272/1272), 2.17 MiB | 1004.00 KiB/s, done.
    Resolving deltas: 100% (1116/1116), done.
    Checking connectivity... done.
    Submodule path 'lib/gl-rs/deps/khronos-api': checked out '95c43bdb7dd4e69145fa0025d142cec7cae89349'
    Cloning into 'deps/sax-rs'...
    remote: Reusing existing pack: 391, done.
    remote: Counting objects: 8, done.
    remote: Compressing objects: 100% (8/8), done.
    remote: Total 399 (delta 0), reused 0 (delta 0)
    Receiving objects: 100% (399/399), 84.00 KiB | 0 bytes/s, done.
    Resolving deltas: 100% (197/197), done.
    Checking connectivity... done.
    Submodule path 'lib/gl-rs/deps/sax-rs': checked out 'a5ae75fa386534226c8c3082c607b696c2c30382'
    Cloning into 'lib/glfw-rs'...
    remote: Counting objects: 3326, done.
    remote: Compressing objects: 100% (1441/1441), done.
    remote: Total 3326 (delta 1703), reused 3307 (delta 1695)
    Receiving objects: 100% (3326/3326), 909.69 KiB | 860.00 KiB/s, done.
    Resolving deltas: 100% (1703/1703), done.
    Checking connectivity... done.
    Submodule path 'lib/glfw-rs': checked out '61518cbd524d33411622c86352e9b4343b4fee90'
    Cloning into 'lib/nalgebra'...
    remote: Reusing existing pack: 3452, done.
    remote: Total 3452 (delta 0), reused 0 (delta 0)
    Receiving objects: 100% (3452/3452), 1.76 MiB | 1.20 MiB/s, done.
    Resolving deltas: 100% (2182/2182), done.
    Checking connectivity... done.
    Submodule path 'lib/nalgebra': checked out '997cd4f888f86c2f566c8c7343be14528ce344b2'
    Cloning into 'lib/ncollide'...
    remote: Reusing existing pack: 11168, done.
    remote: Counting objects: 52, done.
    remote: Compressing objects: 100% (52/52), done.
    remote: Total 11220 (delta 10), reused 0 (delta 0)
    Receiving objects: 100% (11220/11220), 3.36 MiB | 1.37 MiB/s, done.
    Resolving deltas: 100% (8631/8631), done.
    Checking connectivity... done.
    Submodule path 'lib/ncollide': checked out '7e58377b421eae4b298c8e53dc4d6085efaececb'
    Submodule 'nalgebra' (git://github.com/sebcrozet/nalgebra) registered for path 'nalgebra'
    Cloning into 'nalgebra'...
    remote: Reusing existing pack: 3452, done.
    remote: Total 3452 (delta 0), reused 0 (delta 0)
    Receiving objects: 100% (3452/3452), 1.76 MiB | 1.16 MiB/s, done.
    Resolving deltas: 100% (2182/2182), done.
    Checking connectivity... done.
    Submodule path 'lib/ncollide/nalgebra': checked out '997cd4f888f86c2f566c8c7343be14528ce344b2'
    Cloning into 'lib/rust-ffmpeg'...
    remote: Reusing existing pack: 352, done.
    remote: Counting objects: 32, done.
    remote: Compressing objects: 100% (16/16), done.
    remote: Total 384 (delta 8), reused 19 (delta 5)
    Receiving objects: 100% (384/384), 199.94 KiB | 0 bytes/s, done.
    Resolving deltas: 100% (167/167), done.
    Checking connectivity... done.
    Submodule path 'lib/rust-ffmpeg': checked out 'af16cd0f5f217d25615793f8f86a0be33b10b8a4'
    Cloning into 'lib/rust-freetype'...
    remote: Reusing existing pack: 233, done.
    remote: Counting objects: 17, done.
    remote: Compressing objects: 100% (17/17), done.
    remote: Total 250 (delta 7), reused 4 (delta 0)
    Receiving objects: 100% (250/250), 60.29 KiB | 0 bytes/s, done.
    Resolving deltas: 100% (133/133), done.
    Checking connectivity... done.
    Submodule path 'lib/rust-freetype': checked out 'b4f6f7a4a0b99eeccd14c45ba6436debb2fd90a2'
    Cloning into 'lib/rust-stb-image'...
    remote: Counting objects: 318, done.
    remote: Compressing objects: 100% (145/145), done.
    remote: Total 318 (delta 171), reused 318 (delta 171)
    Receiving objects: 100% (318/318), 98.52 KiB | 0 bytes/s, done.
    Resolving deltas: 100% (171/171), done.
    Checking connectivity... done.
    Submodule path 'lib/rust-stb-image': checked out 'b91a0d0f4143cd950b59625fc91173025932703d'
    dev ➤ cd kiss3d
    kiss3d ➤ make deps                                                                                                                                git:master
    make lib -C lib/glfw-rs
    sh etc/link-rs.sh "-lglfw3 -framework Cocoa -framework OpenGL -framework IOKit -framework CoreFoundation -framework CoreVideo " > src/link.rs
    mkdir -p lib
    rustc  --out-dir=lib -O src/glfw.rs
    make -C lib/nalgebra
    mkdir -p lib
    rustc src/lib.rs --out-dir lib --opt-level 3
    rustc src/lib.rs --out-dir lib --crate-type dylib --opt-level 3
    make deps -C lib/ncollide
    make -C nalgebra
    mkdir -p lib
    rustc src/lib.rs --out-dir lib --opt-level 3
    rustc src/lib.rs --out-dir lib --crate-type dylib --opt-level 3
    make 3df32 -C lib/ncollide
    mkdir -p lib
    rustc src/ncollide3df32.rs -L./nalgebra/lib --out-dir lib --opt-level 3 --cfg dim3
    src/narrow/bezier_surface_bezier_surface.rs:55:26: 55:28 warning: unused variable: `ma`, #[warn(unused_variable)] on by default
    src/narrow/bezier_surface_bezier_surface.rs:55     fn update(&mut self, ma: &Matrix, a: &BezierSurface, mb: &Matrix, b: &BezierSurface) {
                                                                            ^~
    src/narrow/bezier_surface_bezier_surface.rs:55:39: 55:40 warning: unused variable: `a`, #[warn(unused_variable)] on by default
    src/narrow/bezier_surface_bezier_surface.rs:55     fn update(&mut self, ma: &Matrix, a: &BezierSurface, mb: &Matrix, b: &BezierSurface) {
                                                                                         ^
    src/narrow/bezier_surface_bezier_surface.rs:55:58: 55:60 warning: unused variable: `mb`, #[warn(unused_variable)] on by default
    src/narrow/bezier_surface_bezier_surface.rs:55     fn update(&mut self, ma: &Matrix, a: &BezierSurface, mb: &Matrix, b: &BezierSurface) {
                                                                                                            ^~
    src/narrow/bezier_surface_bezier_surface.rs:55:71: 55:72 warning: unused variable: `b`, #[warn(unused_variable)] on by default
    src/narrow/bezier_surface_bezier_surface.rs:55     fn update(&mut self, ma: &Matrix, a: &BezierSurface, mb: &Matrix, b: &BezierSurface) {
                                                                                                                         ^
    src/partitioning/dbvt.rs:155:23: 155:42 warning: private type in exported type signature, #[warn(visible_private_types)] on by default
    src/partitioning/dbvt.rs:155     RightChildOf(*mut DBVTInternal<B, BV>),
                                                       ^~~~~~~~~~~~~~~~~~~
    src/partitioning/dbvt.rs:157:22: 157:41 warning: private type in exported type signature, #[warn(visible_private_types)] on by default
    src/partitioning/dbvt.rs:157     LeftChildOf(*mut DBVTInternal<B, BV>),
                                                      ^~~~~~~~~~~~~~~~~~~
    make -C lib/gl-rs
    make lib -C deps/sax-rs
    mkdir -p lib
    rustc --out-dir=lib -O src/sax/lib.rs
    rustc -L deps/sax-rs/lib src/gen/main.rs -o bin/glrsgen
    src/gen/main.rs:65:42: 65:56 warning: use of deprecated item: use `Show` (`{}` format specifier), #[warn(deprecated)] on by default
    src/gen/main.rs:65         Err(x) => fail!("Error: {}\n{}", x.to_err_msg(), usage("glrsgen", opts)),
                                                                ^~~~~~~~~~~~~~
    note: in expansion of format_args!
    <std macros>:24:9: 25:6 note: expansion site
    <std macros>:1:1: 26:2 note: in expansion of fail!
    src/gen/main.rs:65:19: 65:82 note: expansion site
    bin/glrsgen --namespace gl --api gl --profile core --version 4.3 --xml deps/khronos-api/gl.xml   > src/gl.rs
    rustc src/gl.rs -O --out-dir=lib
    mkdir -p examples
    make lib -C deps/glfw-rs
    sh etc/link-rs.sh "-lglfw3 -framework Cocoa -framework OpenGL -framework IOKit -framework CoreFoundation -framework CoreVideo " > src/link.rs
    mkdir -p lib
    rustc  --out-dir=lib -O src/glfw.rs
    rustc -L deps/glfw-rs/lib -L lib --out-dir=examples src/examples/basic.rs
    rustc -L deps/glfw-rs/lib -L lib --out-dir=examples src/examples/triangle.rs
    rustdoc -o doc src/gl.rs
    cd lib/rust-stb-image; ./configure
    make clean -C lib/rust-stb-image
    rm -f *.o *.a *.so *.dylib *.rlib *.dll *.dummy *-test
    make -C lib/rust-stb-image
    cc stb_image.c -o stb_image.o -c -fPIC
    ar rcs libstb-image.a stb_image.o
    rustc  lib.rs --out-dir .
    stb_image.rs:28:5: 28:14 warning: code is never used: `read`, #[warn(dead_code)] on by default
    stb_image.rs:28     read: *u8,
                        ^~~~~~~~~
    stb_image.rs:29:5: 29:14 warning: code is never used: `skip`, #[warn(dead_code)] on by default
    stb_image.rs:29     skip: *u8,
                        ^~~~~~~~~
    stb_image.rs:30:5: 30:13 warning: code is never used: `eof`, #[warn(dead_code)] on by default
    stb_image.rs:30     eof: *u8,
                        ^~~~~~~~
    touch libstb-image.dummy
    cd lib/rust-freetype; ./configure
    make clean -C lib/rust-freetype
    rm -f *.o *.a *.so *.dylib *.rlib *.dll *.dummy *-test
    make -C lib/rust-freetype
    rustc  freetype.rc --out-dir .
    touch librustfreetype.dummy
    kiss3d ➤ make                                                                                                                                     git:master
    mkdir -p lib
    rustc src/lib.rs --opt-level 3 --out-dir lib -Llib/glfw-rs/lib -Llib/gl-rs/lib -Llib/nalgebra/lib -Llib/rust-stb-image/ -Llib/rust-freetype/ -Llib/rust-ffmpeg/lib -Llib/ncollide/lib
    cd lib/rust-ffmpeg; ./build.sh
    Building src/avutil52 ...
    error: linking with `cc` failed: exit code: 1
    note: cc '-m64' '-L' '/usr/local/lib/rustlib/x86_64-apple-darwin/lib' '-o' 'lib/libavutil52-27cdbde1-0.0.dylib' 'lib/avutil52.o' '-Wl,-force_load,/usr/local/lib/rustlib/x86_64-apple-darwin/lib/libmorestack.a' 'lib/avutil52.metadata.o' '-nodefaultlibs' '-Wl,-dead_strip' '-L' '/usr/local/lib/rustlib/x86_64-apple-darwin/lib' '-lstd-59beb4f7-0.11.0-pre' '-L' '/usr/local/lib/rustlib/x86_64-apple-darwin/lib' '-lsync-305341d2-0.11.0-pre' '-L' '/usr/local/lib/rustlib/x86_64-apple-darwin/lib' '-lrustrt-d8560cb2-0.11.0-pre' '-L' 'lib' '-L' '/Users/bzabarauskas/dev/kiss3d/lib/rust-ffmpeg/.rust' '-L' '/Users/bzabarauskas/dev/kiss3d/lib/rust-ffmpeg' '-lavutil' '-lSystem' '-lpthread' '-lc' '-lm' '-dynamiclib' '-Wl,-dylib' '-Wl,-install_name,@rpath/libavutil52-27cdbde1-0.0.dylib' '-Wl,-rpath,@loader_path/../../../../../../../usr/local/lib/rustlib/x86_64-apple-darwin/lib' '-Wl,-rpath,/usr/local/lib/rustlib/x86_64-apple-darwin/lib' '-lcompiler-rt'
    note: ld: warning: directory not found for option '-L/Users/bzabarauskas/dev/kiss3d/lib/rust-ffmpeg/.rust'
    ld: library not found for -lavutil
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    
    error: aborting due to previous error
    make: *** [deps_recording] Error 1
    
    Reviewed by brendanzab at 2014-06-26 20:22
  • 10. canvas: Force correct drop order when render_loop ends

    First time contributing to this repo, lemme know if this PR is stylistically okay.


    After switching my application to use the State-based setup (see examples/persistent_point_cloud.rs for an example), I would get errors when closing the window:

    thread 'main' panicked at 'assertion failed: `(left == right)`
      left: `1282`,
     right: `0`', C:\Users\Henry\.cargo\registry\src\github.com-1ecc6299db9ec823\kiss3d-0.31.0\src\resource\effect.rs:93:12
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    thread 'main' panicked at 'assertion failed: `(left == right)`
      left: `1282`,
     right: `0`', C:\Users\Henry\.cargo\registry\src\github.com-1ecc6299db9ec823\kiss3d-0.31.0\src\resource\effect.rs:93:12
    stack backtrace:
       0:     0x7ff64cfe157e - std::backtrace_rs::backtrace::dbghelp::trace
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\std\src\..\..\backtrace\src\backtrace\dbghelp.rs:98
       1:     0x7ff64cfe157e - std::backtrace_rs::backtrace::trace_unsynchronized
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\std\src\..\..\backtrace\src\backtrace\mod.rs:66
       2:     0x7ff64cfe157e - std::sys_common::backtrace::_print_fmt
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\std\src\sys_common\backtrace.rs:67
       3:     0x7ff64cfe157e - std::sys_common::backtrace::_print::{{impl}}::fmt
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\std\src\sys_common\backtrace.rs:46
       4:     0x7ff64cff626c - core::fmt::write
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\core\src\fmt\mod.rs:1092
       5:     0x7ff64cfdf068 - std::io::Write::write_fmt<std::sys::windows::stdio::Stderr>
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\std\src\io\mod.rs:1572
       6:     0x7ff64cfe402d - std::sys_common::backtrace::_print
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\std\src\sys_common\backtrace.rs:49
       7:     0x7ff64cfe402d - std::sys_common::backtrace::print
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\std\src\sys_common\backtrace.rs:36
       8:     0x7ff64cfe402d - std::panicking::default_hook::{{closure}}
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\std\src\panicking.rs:208
       9:     0x7ff64cfe3af9 - std::panicking::default_hook
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\std\src\panicking.rs:225
      10:     0x7ff64cfe46d3 - std::panicking::rust_panic_with_hook
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\std\src\panicking.rs:591
      11:     0x7ff64cfe4281 - std::panicking::begin_panic_handler::{{closure}}
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\std\src\panicking.rs:497
      12:     0x7ff64cfe1e9f - std::sys_common::backtrace::__rust_end_short_backtrace<closure-0,!>
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\std\src\sys_common\backtrace.rs:141
      13:     0x7ff64cfe41d9 - std::panicking::begin_panic_handler
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\std\src\panicking.rs:493
      14:     0x7ff64cffdbe0 - core::panicking::panic_fmt
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\core\src\panicking.rs:92
      15:     0x7ff64cff407a - core::fmt::Arguments::new_v1
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\core\src\fmt\mod.rs:314
      16:     0x7ff64cff407a - core::panicking::assert_failed::inner
                                   at /rustc/9bc8c42bb2f19e745a63f3445f1ac248fb015e53\/library\core\src\panicking.rs:135
      17:     0x7ff64ceb84dd - core::panicking::assert_failed<u32,u32>
                                   at C:\Users\Henry\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\panicking.rs:143
      18:     0x7ff64cdf8782 - kiss3d::resource::effect::{{impl}}::drop
                                   at C:\Users\Henry\.cargo\registry\src\github.com-1ecc6299db9ec823\kiss3d-0.31.0\src\resource\effect.rs:93
      19:     0x7ff64cd9ce4e - core::ptr::drop_in_place<kiss3d::resource::effect::Effect>
                                   at C:\Users\Henry\.rustup\toolchains\stable-x86_64-pc-windows-msvc\lib\rustlib\src\rust\library\core\src\ptr\mod.rs:187
      20:     0x7ff64cd9d743 - core::ptr::drop_in_place<kiss3d::renderer::line_renderer::LineRenderer>
    

    After enabling the logging in the glow crate, I found that the program for the LineRenderer object in my state was suddenly becoming invalid before I could call IsProgram and DeleteProgram on it. (Those are from the Drop impl for Effect.)

    The issued turned out to be that we were dropping the window before the state, and since the window holds the OpenGL context, when we tried to drop the state, we got errors.

    This diff introduces a new struct that enforces the proper drop order, and hides it behind a trait.

    Reviewed by HenrySwanson at 2021-09-21 08:30
  • 11. Code compiles, but examples don't run with recent rust nightlies

    When I build kiss3d using cargo build and then try to run any example (e.g `$ target/cube), I get the following error message:

    dyld: Library not loaded: x86_64-apple-darwin/stage2/lib/rustlib/x86_64-apple-darwin/lib/libsemver-4e7c5e5c.dylib
      Referenced from: ~/kiss3d/target/cube
      Reason: image not found
    Trace/BPT trap: 5
    

    This is with the current Rust and Cargo nightly (pulled via rustup) on OS X 10.9.4, but happened with nightlies in the last few days as well.

    I'm not sure where this problem originates, but I think this is the right place to report it, since other libs I've tested work. If you think this is a bug in Rust, some help in how to go about producing a minimal example that reproduces this would be nice.

    Reviewed by mruegenberg at 2014-07-21 17:42
  • 12. NormalsMaterial / UvsMaterial not working

    I tried switching to NormalsMaterial or UvsMaterial and neither seems to be working (the shapes I apply the material to don't show up). I tried comparing the code to ObjectsMaterial and couldn't find anything materially different in the use of underlying APIs, so I don't know what's not working. Tried messing around with the shaders (eg to always show white) but still nothing shows up. I can create my own material (starting from ObjectsMaterial) and I can make it show normals or UVs and that works fine.

    In any case, I think it would be worth it to have an example with all materials just so the code doesn't rot.

    Reviewed by RaduBerinde at 2022-06-18 16:37
  • 13. Document planar coordinate system

    It's not very clear what coordinate system that planar coordinates use - i.e. what coordinates represent the corners of the window.

    FixedView does not have any configuration parameters while Sidescroll only has a multiplier for zoom.

    Reviewed by ColonelThirtyTwo at 2022-04-11 14:22
  • 14. Should the README use the bundled Nalgebra version?

    The example on the README uses nalgebra as an external crate but when I ran this locally it complained of Kiss3d functions (particularly from_axis_angle) unable take Nalgebra objects but needed kiss3d::nalgrebra objects instead.

    I think these lines in the README needs to be changed from:

    extern create nalgebra as na;
    
    use na::{Vector3, UnitQuaternion};
    

    To

    use kiss3d::nalgebra::{Vector3, UnitQuaternion};
    

    Also just let me know if there is a way around this to use an external version of nalgebra that differs from the bundled version.

    EDIT: I see this is acknowledged further down in the README, but if you are forced to used the same version of Nalgebra as Kiss3d anyways it might be easier for users to just use the bundled version.

    Reviewed by TheCynosure at 2022-03-06 22:47
  • 15. Text scale?

    I'm trying to align text rendering with planar rendering, drawing some text on top of a rect to make a button for example. But text rendering seems to use a different scale than pixels, the text appears much smaller than it should and offset up and left. What determines text scale compared to pixel scale and how can I read or write it?

    Reviewed by pypypypypypypypypyp at 2022-02-12 05:29
  • 16. `point_size`

    In gl_context.rs, the method to change the point size is commented out, without any comment as to why.

       fn point_size(&self, _size: f32) {
           // unsafe { self.context.point_size(_size) }
        }
    

    Is there a reason changing point size is commented out?

    We uncommented it and it works fine on some platforms but not all -- on the Apple M1 machine, for instance, it fails to change the point size.

    Reviewed by weitsang at 2021-07-13 06:14
Related tags
A little cross-platform graphics engine written in rust.

Bismuth This is a version of my C++ graphics engine named Bismuth re-written with Rust. My goal is to learn more about the Rust language and make my g

Nov 1, 2021
A vector graphics renderer using OpenGL with a Rust & C API.
A vector graphics renderer using OpenGL with a Rust & C API.

bufro A vector graphics renderer using OpenGL with a Rust & C API. A Rust example can be found in examples/quickstart.rs (using glutin). A C example c

Jun 19, 2022
Rust bindings to bgfx, a cross-platform, graphics API agnostic

Rust bindings to bgfx, a cross-platform, graphics API agnostic, "Bring Your Own Engine/Framework" style rendering library.

Jun 8, 2022
Generic framebuffer implementation in Rust for use with embedded-graphics library

Fraramebuffer implementation for Rust's Embedded-graphics Framebuffer approach helps to deal with display flickering when you update multiple parts of

Jun 7, 2022
wgpugd: A WebGPU Graphics Device for R
wgpugd: A WebGPU Graphics Device for R

wgpugd: A WebGPU Graphics Device for R Overview What is WebGPU? WebGPU is an API that exposes the capabilities of GPU hardware. What is wgpu? As the n

May 15, 2022
Graphite is a digital content creation software package for 2D graphics
Graphite is a digital content creation software package for 2D graphics

Powerful 2D vector and raster editing. Procedural and nondestructive. Graphite is a digital content creation software package for 2D graphics, merging

Jun 23, 2022
Baryon is a compact 3D engine focused on fast prototyping in code.
Baryon is a compact 3D engine focused on fast prototyping in code.

baryon Baryon is a compact 3D engine focused on fast prototyping in code. No big dependencies, no fancy run-times, GUI editors, or other magic. Depend

Jun 8, 2022
Simple but powerful graph library for Rust

Graphlib Graphlib is a simple and powerful Rust graph library. This library attempts to provide a generic api for building, mutating and iterating ove

Jun 13, 2022
A simple and elegant, pipewire graph editor
 A simple and elegant, pipewire graph editor

pw-viz A simple and elegant, pipewire graph editor This is still a WIP, node layouting is kinda jank at the moment. Installation A compiled binary is

Jun 22, 2022
A toy ray tracer in Rust
A toy ray tracer in Rust

tray_rust - A Toy Ray Tracer in Rust tray_rust is a toy physically based ray tracer built off of the techniques discussed in Physically Based Renderin

Jun 20, 2022
A low-overhead Vulkan-like GPU API for Rust.
A low-overhead Vulkan-like GPU API for Rust.

Getting Started | Documentation | Blog gfx-rs gfx-rs is a low-level, cross-platform graphics and compute abstraction library in Rust. It consists of t

Jun 20, 2022
A complete harfbuzz's shaping algorithm port to Rust

rustybuzz rustybuzz is a complete harfbuzz's shaping algorithm port to Rust. Matches harfbuzz v2.7.0 Why? Because you can add rustybuzz = "*" to your

Jun 9, 2022
An OpenGL function pointer loader for Rust

gl-rs Overview This repository contains the necessary building blocks for OpenGL wrapper libraries. For more information on each crate, see their resp

Jun 8, 2022
Safe OpenGL wrapper for the Rust language.

glium Note to current and future Glium users: Glium is no longer actively developed by its original author. That said, PRs are still welcome and maint

Jun 22, 2022
GLFW3 bindings and idiomatic wrapper for Rust.

glfw-rs GLFW bindings and wrapper for The Rust Programming Language. Example extern crate glfw; use glfw::{Action, Context, Key}; fn main() { le

Jun 21, 2022
Safe and rich Rust wrapper around the Vulkan API
Safe and rich Rust wrapper around the Vulkan API

Vulkano See also vulkano.rs. Vulkano is a Rust wrapper around the Vulkan graphics API. It follows the Rust philosophy, which is that as long as you do

Jun 27, 2022
Graph data structure library for Rust.

petgraph Graph data structure library. Supports Rust 1.41 and later. Please read the API documentation here Crate feature flags: graphmap (default) en

Jun 20, 2022
A graph library for Rust.

Gamma A graph library for Rust. Gamma provides primitives and traversals for working with graphs. It is based on ideas presented in A Minimal Graph AP

Jun 3, 2022
A cool, fast maze generator and solver written in Rust
A cool, fast maze generator and solver written in Rust

MazeCruncher Welcome to maze cruncher! Download Standalone Here Usage To get started, just run the standalone .exe in target/release or compile and ru

May 24, 2022