| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- /*
- * Copyright (c) 2012-2014 Daniele Bartolini and individual contributors.
- * License: https://github.com/taylor001/crown/blob/master/LICENSE
- */
- #include "material.h"
- #include "material_resource.h"
- #include "memory.h"
- #include "device.h"
- #include "resource_manager.h"
- #include "texture_resource.h"
- #include "material_manager.h"
- #include "shader.h"
- #include <bgfx.h>
- namespace crown
- {
- using namespace material_resource;
- void Material::create(const MaterialResource* mr, MaterialManager& mm)
- {
- uint32_t size = dynamic_data_size(mr);
- uint32_t offt = dynamic_data_offset(mr);
- char* base = (char*) mr + offt;
- data = (char*) default_allocator().allocate(size);
- memcpy(data, base, size);
- resource = mr;
- }
- void Material::destroy() const
- {
- default_allocator().deallocate(data);
- }
- void Material::bind() const
- {
- Shader* shader = (Shader*) device()->resource_manager()->get(SHADER_TYPE, material_resource::shader(resource));
- bgfx::setProgram(shader->program);
- // Set samplers
- for (uint32_t i = 0; i < num_textures(resource); i++)
- {
- TextureData* td = get_texture_data(resource, i);
- TextureHandle* th = get_texture_handle(resource, i, data);
- bgfx::UniformHandle sampler;
- bgfx::TextureHandle texture;
- sampler.idx = th->sampler_handle;
- TextureResource* teximg = (TextureResource*) device()->resource_manager()->get(TEXTURE_TYPE, td->id);
- texture.idx = teximg->handle.idx;
- bgfx::setTexture(i, sampler, texture);
- }
- // Set uniforms
- for (uint32_t i = 0; i < num_uniforms(resource); i++)
- {
- UniformHandle* uh = get_uniform_handle(resource, i, data);
- bgfx::UniformHandle buh;
- buh.idx = uh->uniform_handle;
- bgfx::setUniform(buh, (char*) uh + sizeof(uh->uniform_handle));
- }
- }
- void Material::set_float(const char* name, float val)
- {
- char* p = (char*) get_uniform_handle_by_string(resource, name, data);
- *((float*)(p + sizeof(uint32_t))) = val;
- }
- void Material::set_vector2(const char* name, const Vector2& val)
- {
- char* p = (char*) get_uniform_handle_by_string(resource, name, data);
- *((Vector2*)(p + sizeof(uint32_t))) = val;
- }
- void Material::set_vector3(const char* name, const Vector3& val)
- {
- char* p = (char*) get_uniform_handle_by_string(resource, name, data);
- *((Vector3*)(p + sizeof(uint32_t))) = val;
- }
- } // namespace crown
|