material.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. * Copyright (c) 2012-2016 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "device.h"
  6. #include "material.h"
  7. #include "material_manager.h"
  8. #include "material_resource.h"
  9. #include "memory.h"
  10. #include "resource_manager.h"
  11. #include "shader.h"
  12. #include "shader_manager.h"
  13. #include "texture_resource.h"
  14. #include <bgfx/bgfx.h>
  15. #include <string.h> // memcpy
  16. namespace crown
  17. {
  18. using namespace material_resource;
  19. void Material::create(const MaterialResource* mr, MaterialManager& mm)
  20. {
  21. uint32_t size = dynamic_data_size(mr);
  22. uint32_t offt = dynamic_data_offset(mr);
  23. char* base = (char*) mr + offt;
  24. data = (char*) default_allocator().allocate(size);
  25. memcpy(data, base, size);
  26. resource = mr;
  27. }
  28. void Material::destroy() const
  29. {
  30. default_allocator().deallocate(data);
  31. }
  32. void Material::bind() const
  33. {
  34. // Set samplers
  35. for (uint32_t i = 0; i < num_textures(resource); i++)
  36. {
  37. TextureData* td = get_texture_data(resource, i);
  38. TextureHandle* th = get_texture_handle(resource, i, data);
  39. bgfx::UniformHandle sampler;
  40. bgfx::TextureHandle texture;
  41. sampler.idx = th->sampler_handle;
  42. TextureResource* teximg = (TextureResource*) device()->resource_manager()->get(TEXTURE_TYPE, td->id);
  43. texture.idx = teximg->handle.idx;
  44. bgfx::setTexture(i, sampler, texture);
  45. }
  46. // Set uniforms
  47. for (uint32_t i = 0; i < num_uniforms(resource); i++)
  48. {
  49. UniformHandle* uh = get_uniform_handle(resource, i, data);
  50. bgfx::UniformHandle buh;
  51. buh.idx = uh->uniform_handle;
  52. bgfx::setUniform(buh, (char*) uh + sizeof(uh->uniform_handle));
  53. }
  54. const ShaderManager::ShaderData& sd = device()->shader_manager()->get(material_resource::shader(resource));
  55. bgfx::setState(sd.state);
  56. bgfx::submit(0, sd.program);
  57. }
  58. void Material::set_float(const char* name, float val)
  59. {
  60. char* p = (char*) get_uniform_handle_by_string(resource, name, data);
  61. *((float*)(p + sizeof(uint32_t))) = val;
  62. }
  63. void Material::set_vector2(const char* name, const Vector2& val)
  64. {
  65. char* p = (char*) get_uniform_handle_by_string(resource, name, data);
  66. *((Vector2*)(p + sizeof(uint32_t))) = val;
  67. }
  68. void Material::set_vector3(const char* name, const Vector3& val)
  69. {
  70. char* p = (char*) get_uniform_handle_by_string(resource, name, data);
  71. *((Vector3*)(p + sizeof(uint32_t))) = val;
  72. }
  73. } // namespace crown