static gboolean _set_uniform (GQuark field_id, const GValue * value, gpointer user_data) { GstGLShader *shader = user_data; const gchar *field_name = g_quark_to_string (field_id); if (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_INT)) { gst_gl_shader_set_uniform_1i (shader, field_name, g_value_get_int (value)); } else if (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLOAT)) { gst_gl_shader_set_uniform_1f (shader, field_name, g_value_get_float (value)); #ifdef HAVE_GRAPHENE } else if (G_TYPE_CHECK_VALUE_TYPE ((value), GRAPHENE_TYPE_VEC2)) { graphene_vec2_t *vec2 = g_value_get_boxed (value); float x = graphene_vec2_get_x (vec2); float y = graphene_vec2_get_y (vec2); gst_gl_shader_set_uniform_2f (shader, field_name, x, y); } else if (G_TYPE_CHECK_VALUE_TYPE ((value), GRAPHENE_TYPE_VEC3)) { graphene_vec3_t *vec3 = g_value_get_boxed (value); float x = graphene_vec3_get_x (vec3); float y = graphene_vec3_get_y (vec3); float z = graphene_vec3_get_z (vec3); gst_gl_shader_set_uniform_3f (shader, field_name, x, y, z); } else if (G_TYPE_CHECK_VALUE_TYPE ((value), GRAPHENE_TYPE_VEC4)) { graphene_vec4_t *vec4 = g_value_get_boxed (value); float x = graphene_vec4_get_x (vec4); float y = graphene_vec4_get_y (vec4); float z = graphene_vec4_get_z (vec4); float w = graphene_vec4_get_w (vec4); gst_gl_shader_set_uniform_4f (shader, field_name, x, y, z, w); } else if (G_TYPE_CHECK_VALUE_TYPE ((value), GRAPHENE_TYPE_MATRIX)) { graphene_matrix_t *matrix = g_value_get_boxed (value); float matrix_f[16]; graphene_matrix_to_float (matrix, matrix_f); gst_gl_shader_set_uniform_matrix_4fv (shader, field_name, 1, FALSE, matrix_f); #endif } else { /* FIXME: Add support for unsigned ints, non 4x4 matrices, etc */ GST_FIXME ("Don't know how to set the \'%s\' paramater. Unknown type", field_name); return TRUE; } return TRUE; }
static void gthree_basic_material_real_set_uniforms (GthreeMaterial *material, GthreeUniforms *uniforms, GthreeCamera *camera) { GthreeBasicMaterial *basic = GTHREE_BASIC_MATERIAL (material); GthreeBasicMaterialPrivate *priv = gthree_basic_material_get_instance_private (basic); GthreeTexture *scale_map; GthreeUniform *uni; GTHREE_MATERIAL_CLASS (gthree_basic_material_parent_class)->set_uniforms (material, uniforms, camera); uni = gthree_uniforms_lookup_from_string (uniforms, "diffuse"); if (uni != NULL) gthree_uniform_set_color (uni, &priv->color); uni = gthree_uniforms_lookup_from_string (uniforms, "map"); if (uni != NULL) gthree_uniform_set_texture (uni, priv->map); /* uv repeat and offset setting priorities * 1. color map * 2. specular map * 3. normal map * 4. bump map * 5. alpha map */ scale_map = NULL; if (priv->map != NULL) scale_map = priv->map; // ... other maps if (scale_map != NULL) { const graphene_vec2_t *repeat = gthree_texture_get_repeat (scale_map); const graphene_vec2_t *offset = gthree_texture_get_offset (scale_map); graphene_vec4_t offset_repeat; graphene_vec4_init (&offset_repeat, graphene_vec2_get_x (offset), graphene_vec2_get_y (offset), graphene_vec2_get_x (repeat), graphene_vec2_get_y (repeat)); uni = gthree_uniforms_lookup_from_string (uniforms, "offsetRepeat"); if (uni != NULL) gthree_uniform_set_vec4 (uni, &offset_repeat); } uni = gthree_uniforms_lookup_from_string (uniforms, "envMap"); if (uni != NULL) gthree_uniform_set_texture (uni, priv->env_map); uni = gthree_uniforms_lookup_from_string (uniforms, "useRefract"); if (uni != NULL) gthree_uniform_set_int (uni, priv->env_map && gthree_texture_get_mapping (priv->env_map) == GTHREE_MAPPING_CUBE_REFRACTION); uni = gthree_uniforms_lookup_from_string (uniforms, "flipEnvMap"); if (uni != NULL) gthree_uniform_set_float (uni, (TRUE /* TODO: material.envMap instanceof THREE.WebGLRenderTargetCube */) ? 1 : -1); uni = gthree_uniforms_lookup_from_string (uniforms, "combine"); if (uni != NULL) gthree_uniform_set_int (uni, priv->combine); uni = gthree_uniforms_lookup_from_string (uniforms, "refractionRatio"); if (uni != NULL) gthree_uniform_set_float (uni, priv->refraction_ratio); // TODO: More from refreshUniformsCommon }