Changeset View
Changeset View
Standalone View
Standalone View
source/blender/gpu/intern/gpu_material.c
| Show First 20 Lines • Show All 106 Lines • ▼ Show 20 Lines | struct GPUMaterial { | ||||
| int dynproperty; | int dynproperty; | ||||
| /* for passing uniforms */ | /* for passing uniforms */ | ||||
| int viewmatloc, invviewmatloc; | int viewmatloc, invviewmatloc; | ||||
| int obmatloc, invobmatloc; | int obmatloc, invobmatloc; | ||||
| int obcolloc, obautobumpscaleloc; | int obcolloc, obautobumpscaleloc; | ||||
| int cameratexcofacloc; | int cameratexcofacloc; | ||||
| int partscalarpropsloc; | |||||
| int partcoloc; | |||||
| int partvel; | |||||
| int partangvel; | |||||
| ListBase lamps; | ListBase lamps; | ||||
| bool bound; | bool bound; | ||||
| }; | }; | ||||
| struct GPULamp { | struct GPULamp { | ||||
| Scene *scene; | Scene *scene; | ||||
| Object *ob; | Object *ob; | ||||
| Object *par; | Object *par; | ||||
| ▲ Show 20 Lines • Show All 113 Lines • ▼ Show 20 Lines | if (material->outlink) { | ||||
| if (material->builtins & GPU_INVERSE_OBJECT_MATRIX) | if (material->builtins & GPU_INVERSE_OBJECT_MATRIX) | ||||
| material->invobmatloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_INVERSE_OBJECT_MATRIX)); | material->invobmatloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_INVERSE_OBJECT_MATRIX)); | ||||
| if (material->builtins & GPU_OBCOLOR) | if (material->builtins & GPU_OBCOLOR) | ||||
| material->obcolloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_OBCOLOR)); | material->obcolloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_OBCOLOR)); | ||||
| if (material->builtins & GPU_AUTO_BUMPSCALE) | if (material->builtins & GPU_AUTO_BUMPSCALE) | ||||
| material->obautobumpscaleloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_AUTO_BUMPSCALE)); | material->obautobumpscaleloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_AUTO_BUMPSCALE)); | ||||
| if (material->builtins & GPU_CAMERA_TEXCO_FACTORS) | if (material->builtins & GPU_CAMERA_TEXCO_FACTORS) | ||||
| material->cameratexcofacloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_CAMERA_TEXCO_FACTORS)); | material->cameratexcofacloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_CAMERA_TEXCO_FACTORS)); | ||||
| if (material->builtins & GPU_PARTICLE_SCALAR_PROPS) | |||||
| material->partscalarpropsloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_PARTICLE_SCALAR_PROPS)); | |||||
| if (material->builtins & GPU_PARTICLE_LOCATION) | |||||
| material->partcoloc = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_PARTICLE_LOCATION)); | |||||
| if (material->builtins & GPU_PARTICLE_VELOCITY) | |||||
| material->partvel = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_PARTICLE_VELOCITY)); | |||||
| if (material->builtins & GPU_PARTICLE_ANG_VELOCITY) | |||||
| material->partangvel = GPU_shader_get_uniform(shader, GPU_builtin_name(GPU_PARTICLE_ANG_VELOCITY)); | |||||
| return 1; | return 1; | ||||
| } | } | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| void GPU_material_free(ListBase *gpumaterial) | void GPU_material_free(ListBase *gpumaterial) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 110 Lines • ▼ Show 20 Lines | if (material->pass) { | ||||
| } | } | ||||
| GPU_pass_update_uniforms(material->pass); | GPU_pass_update_uniforms(material->pass); | ||||
| material->bound = 1; | material->bound = 1; | ||||
| } | } | ||||
| } | } | ||||
| void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[4][4], float obcol[4], float autobumpscale) | void GPU_material_bind_uniforms(GPUMaterial *material, float obmat[4][4], float obcol[4], float autobumpscale, GPUParticleInfo* pi) | ||||
| { | { | ||||
| if (material->pass) { | if (material->pass) { | ||||
| GPUShader *shader = GPU_pass_shader(material->pass); | GPUShader *shader = GPU_pass_shader(material->pass); | ||||
| float invmat[4][4], col[4]; | float invmat[4][4], col[4]; | ||||
| /* handle per object builtins */ | /* handle per object builtins */ | ||||
| if (material->builtins & GPU_OBJECT_MATRIX) { | if (material->builtins & GPU_OBJECT_MATRIX) { | ||||
| GPU_shader_uniform_vector(shader, material->obmatloc, 16, 1, (float*)obmat); | GPU_shader_uniform_vector(shader, material->obmatloc, 16, 1, (float*)obmat); | ||||
| } | } | ||||
| if (material->builtins & GPU_INVERSE_OBJECT_MATRIX) { | if (material->builtins & GPU_INVERSE_OBJECT_MATRIX) { | ||||
| invert_m4_m4(invmat, obmat); | invert_m4_m4(invmat, obmat); | ||||
| GPU_shader_uniform_vector(shader, material->invobmatloc, 16, 1, (float*)invmat); | GPU_shader_uniform_vector(shader, material->invobmatloc, 16, 1, (float*)invmat); | ||||
| } | } | ||||
| if (material->builtins & GPU_OBCOLOR) { | if (material->builtins & GPU_OBCOLOR) { | ||||
| copy_v4_v4(col, obcol); | copy_v4_v4(col, obcol); | ||||
| CLAMP(col[3], 0.0f, 1.0f); | CLAMP(col[3], 0.0f, 1.0f); | ||||
| GPU_shader_uniform_vector(shader, material->obcolloc, 4, 1, col); | GPU_shader_uniform_vector(shader, material->obcolloc, 4, 1, col); | ||||
| } | } | ||||
| if (material->builtins & GPU_AUTO_BUMPSCALE) { | if (material->builtins & GPU_AUTO_BUMPSCALE) { | ||||
| GPU_shader_uniform_vector(shader, material->obautobumpscaleloc, 1, 1, &autobumpscale); | GPU_shader_uniform_vector(shader, material->obautobumpscaleloc, 1, 1, &autobumpscale); | ||||
| } | } | ||||
| if (material->builtins & GPU_PARTICLE_SCALAR_PROPS) { | |||||
| GPU_shader_uniform_vector(shader, material->partscalarpropsloc, 4, 1, pi->scalprops); | |||||
| } | |||||
| if (material->builtins & GPU_PARTICLE_LOCATION) { | |||||
| GPU_shader_uniform_vector(shader, material->partcoloc, 3, 1, pi->location); | |||||
| } | |||||
| if (material->builtins & GPU_PARTICLE_VELOCITY) { | |||||
| GPU_shader_uniform_vector(shader, material->partvel, 3, 1, pi->velocity); | |||||
| } | |||||
| if (material->builtins & GPU_PARTICLE_ANG_VELOCITY) { | |||||
| GPU_shader_uniform_vector(shader, material->partangvel, 3, 1, pi->angular_velocity); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| void GPU_material_unbind(GPUMaterial *material) | void GPU_material_unbind(GPUMaterial *material) | ||||
| { | { | ||||
| if (material->pass) { | if (material->pass) { | ||||
| material->bound = 0; | material->bound = 0; | ||||
| GPU_pass_unbind(material->pass); | GPU_pass_unbind(material->pass); | ||||
| ▲ Show 20 Lines • Show All 1,998 Lines • Show Last 20 Lines | |||||