minwebgl 0.3.0

Minimal WebGL toolkit for concise graphics programming with utilities, shaders, and resource management
use crate::*;
use core::any::type_name_of_val;

impl UniformUpload for f32
{
  fn upload( &self, gl : &GL, uniform_location : Option< WebGlUniformLocation > ) -> Result< (), WebglError >
  {
    Ok( gl.uniform1f( uniform_location.as_ref(), *self ) )
  }
}

impl UniformUpload for [ f32 ]
{
  fn upload( &self, gl : &GL, uniform_location : Option< WebGlUniformLocation > ) -> Result< (), WebglError >
  {
    match self.len()
    {
      1 => Ok( gl.uniform1fv_with_f32_array( uniform_location.as_ref(), self ) ),
      2 => Ok( gl.uniform2fv_with_f32_array( uniform_location.as_ref(), self ) ),
      3 => Ok( gl.uniform3fv_with_f32_array( uniform_location.as_ref(), self ) ),
      4 => Ok( gl.uniform4fv_with_f32_array( uniform_location.as_ref(), self ) ),
      _ => Err
      (
        WebglError::CantUploadUniform
        (
          "vector",
          type_name_of_val( self ),
          self.len(),
          "1, 2, 3, 4",
        ),
      )
    }
  }
}

impl UniformMatrixUpload for [ f32 ]
{
  fn matrix_upload( &self, gl : &GL, uniform_location : Option< WebGlUniformLocation >, column_major : bool ) -> Result< (), WebglError >
  {
    match self.len()
    {
      4 => Ok( gl.uniform_matrix2fv_with_f32_array( uniform_location.as_ref(), !column_major, self ) ),
      9 => Ok( gl.uniform_matrix3fv_with_f32_array( uniform_location.as_ref(), !column_major, self ) ),
      16 => Ok( gl.uniform_matrix4fv_with_f32_array( uniform_location.as_ref(), !column_major, self ) ),
      _ => Err
      (
        WebglError::CantUploadUniform
        (
          "vector",
          type_name_of_val( self ),
          self.len(),
          "1, 2, 3, 4",
        ),
      )
    }
  }
}

impl< const N : usize > UniformUpload for [ f32 ; N ]
{
  fn upload( &self, gl : &GL, uniform_location : Option< WebGlUniformLocation > ) -> Result< (), WebglError >
  {
    match self.len()
    {
      1 => Ok( gl.uniform1fv_with_f32_array( uniform_location.as_ref(), self ) ),
      2 => Ok( gl.uniform2fv_with_f32_array( uniform_location.as_ref(), self ) ),
      3 => Ok( gl.uniform3fv_with_f32_array( uniform_location.as_ref(), self ) ),
      4 => Ok( gl.uniform4fv_with_f32_array( uniform_location.as_ref(), self ) ),
      _ => Err
      (
        WebglError::CantUploadUniform
        (
          "vector",
          type_name_of_val( self ),
          self.len(),
          "1, 2, 3, 4",
        ),
      )
    }
  }
}

impl< const N : usize > UniformUpload for [ [ f32 ; N ] ]
{
  fn upload( &self, gl : &GL, uniform_location : Option< WebGlUniformLocation > ) -> Result< (), WebglError >
  {
    match N
    {
      1 => Ok( gl.uniform1fv_with_f32_array( uniform_location.as_ref(), self.as_flattened() ) ),
      2 => Ok( gl.uniform2fv_with_f32_array( uniform_location.as_ref(), self.as_flattened() ) ),
      3 => Ok( gl.uniform3fv_with_f32_array( uniform_location.as_ref(), self.as_flattened() ) ),
      4 => Ok( gl.uniform4fv_with_f32_array( uniform_location.as_ref(), self.as_flattened() ) ),
      _ => Err
      (
        WebglError::CantUploadUniform
        (
          "vector",
          type_name_of_val( self ),
          self.len(),
          "1, 2, 3, 4",
        ),
      )
    }
  }
}

impl< const N : usize > UniformMatrixUpload for [ f32 ; N ]
{
  fn matrix_upload( &self, gl : &GL, uniform_location : Option< WebGlUniformLocation >, column_major : bool ) -> Result< (), WebglError >
  {
    match self.len()
    {
      4 => Ok( gl.uniform_matrix2fv_with_f32_array( uniform_location.as_ref(), !column_major, self ) ),
      9 => Ok( gl.uniform_matrix3fv_with_f32_array( uniform_location.as_ref(), !column_major, self ) ),
      16 => Ok( gl.uniform_matrix4fv_with_f32_array( uniform_location.as_ref(), !column_major, self ) ),
      _ => Err
      (
        WebglError::CantUploadUniform
        (
          "vector",
          type_name_of_val( self ),
          self.len(),
          "1, 2, 3, 4",
        ),
      )
    }
  }
}