material.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * Copyright (c) 2012-2016 Daniele Bartolini and individual contributors.
  3. * License: https://github.com/taylor001/crown/blob/master/LICENSE
  4. */
  5. #include "material.h"
  6. #include "material_resource.h"
  7. #include "resource_manager.h"
  8. #include "shader_manager.h"
  9. #include "texture_resource.h"
  10. #include <bgfx/bgfx.h>
  11. namespace crown
  12. {
  13. void Material::bind(ResourceManager& rm, ShaderManager& sm, u8 view) const
  14. {
  15. using namespace material_resource;
  16. // Set samplers
  17. for (u32 i = 0; i < _resource->num_textures; ++i)
  18. {
  19. const TextureData* td = get_texture_data(_resource, i);
  20. const TextureHandle* th = get_texture_handle(_resource, i, _data);
  21. const TextureResource* teximg = (TextureResource*)rm.get(TEXTURE_TYPE, td->id);
  22. bgfx::UniformHandle sampler;
  23. bgfx::TextureHandle texture;
  24. sampler.idx = th->sampler_handle;
  25. texture.idx = teximg->handle.idx;
  26. bgfx::setTexture(i, sampler, texture);
  27. }
  28. // Set uniforms
  29. for (u32 i = 0; i < _resource->num_uniforms; ++i)
  30. {
  31. const UniformHandle* uh = get_uniform_handle(_resource, i, _data);
  32. bgfx::UniformHandle buh;
  33. buh.idx = uh->uniform_handle;
  34. bgfx::setUniform(buh, (char*)uh + sizeof(uh->uniform_handle));
  35. }
  36. const ShaderData& sd = sm.get(_resource->shader);
  37. bgfx::setState(sd.state);
  38. bgfx::submit(view, sd.program);
  39. }
  40. void Material::set_float(const char* name, f32 val)
  41. {
  42. using namespace material_resource;
  43. char* p = (char*)get_uniform_handle_by_string(_resource, name, _data);
  44. *((f32*)(p + sizeof(u32))) = val;
  45. }
  46. void Material::set_vector2(const char* name, const Vector2& val)
  47. {
  48. using namespace material_resource;
  49. char* p = (char*)get_uniform_handle_by_string(_resource, name, _data);
  50. *((Vector2*)(p + sizeof(u32))) = val;
  51. }
  52. void Material::set_vector3(const char* name, const Vector3& val)
  53. {
  54. using namespace material_resource;
  55. char* p = (char*)get_uniform_handle_by_string(_resource, name, _data);
  56. *((Vector3*)(p + sizeof(u32))) = val;
  57. }
  58. } // namespace crown