Explorar el Código

read and use scale/translate texture transforms, fix #42

Ivan Avdeev hace 6 años
padre
commit
fca8f2132e
Se han modificado 2 ficheros con 18 adiciones y 2 borrados
  1. 11 0
      src/material.c
  2. 7 2
      src/render.c

+ 11 - 0
src/material.c

@@ -23,6 +23,17 @@ static VMFAction materialReadKeyValue(MaterialContext *ctx, const VMFKeyValue *k
 
 	if (strncasecmp("$basetexture", kv->key.str, kv->key.length) == 0) {
 		ctx->mat->base_texture.texture = textureGet(value, ctx->collection, ctx->temp);
+	} else if (strncasecmp("$basetexturetransform", kv->key.str, kv->key.length) == 0) {
+		AVec2f center, scale, translate;
+		float rotate;
+		if (7 != sscanf(value, "center %f %f scale %f %f rotate %f translate %f %f",
+					&center.x, &center.y, &scale.x, &scale.y, &rotate, &translate.x, &translate.y)) {
+			PRINTF("ERR: transform has wrong format: \"%s\"", value);
+		} else {
+			ctx->mat->base_texture.transform.scale = scale;
+			ctx->mat->base_texture.transform.translate = translate;
+			// TODO support rotation
+		}
 	} else if (strncasecmp("include", kv->key.str, kv->key.length) == 0) {
 		char *vmt = strstr(value, ".vmt");
 		if (vmt)

+ 7 - 2
src/render.c

@@ -270,6 +270,8 @@ RENDER_LIST_ATTRIBS
 	RENDER_DECLARE_UNIFORM(lightmap) \
 	RENDER_DECLARE_UNIFORM(tex0) \
 	RENDER_DECLARE_UNIFORM(tex0_size) \
+	RENDER_DECLARE_UNIFORM(tex0_scale) \
+	RENDER_DECLARE_UNIFORM(tex0_translate) \
 
 static const RUniform uniforms[] = {
 #define RENDER_DECLARE_UNIFORM(n) {"u_" # n},
@@ -367,8 +369,9 @@ static RProgram programs[MShader_COUNT] = {
 		"attribute vec2 a_tex_uv;\n"
 		"uniform mat4 u_mvp;\n"
 		"uniform float u_far;\n"
+		"uniform vec2 u_tex0_scale, u_tex0_translate;\n"
 		"void main() {\n"
-			"v_uv = a_tex_uv;\n"
+			"v_uv = a_tex_uv * u_tex0_scale + u_tex0_translate;\n"
 			"gl_Position = u_mvp * vec4(u_far * .5 * a_vertex, 1.);\n"
 		"}\n",
 		/* fragment */
@@ -607,8 +610,10 @@ static int renderUseMaterial(const Material *m) {
 	if (m->base_texture.texture) {
 		const RTexture *t = &m->base_texture.texture->texture;
 		if (t != r.current_tex0) {
-			renderBindTexture(&m->base_texture.texture->texture, 1, 0);
+			renderBindTexture(&m->base_texture.texture->texture, 1, m->shader == MShader_UnlitGeneric);
 			GL_CALL(glUniform2f(r.current_program->uniform_locations[RUniformKind_tex0_size], (float)t->width, (float)t->height));
+			GL_CALL(glUniform2f(r.current_program->uniform_locations[RUniformKind_tex0_scale], m->base_texture.transform.scale.x, m->base_texture.transform.scale.y));
+			GL_CALL(glUniform2f(r.current_program->uniform_locations[RUniformKind_tex0_translate], m->base_texture.transform.translate.x, m->base_texture.transform.translate.y));
 			r.current_tex0 = t;
 		}
 	}