Commit: 570d6e8739aa8ee55e5044718b64c4cc06275cc9
Author: Nicholas Bishop
Date:   Thu Jan 22 14:17:22 2015 +0100
Branches: cycles-ptex-12
https://developer.blender.org/rB570d6e8739aa8ee55e5044718b64c4cc06275cc9

Simplify some of the Ptex GLSL drawing code

===================================================================

M       source/blender/gpu/GPU_extensions.h
M       source/blender/gpu/intern/gpu_codegen.c
M       source/blender/gpu/intern/gpu_draw.c
M       source/blender/gpu/intern/gpu_extensions.c
M       source/blender/makesdna/DNA_image_types.h

===================================================================

diff --git a/source/blender/gpu/GPU_extensions.h 
b/source/blender/gpu/GPU_extensions.h
index bb0cf2d..262399d 100644
--- a/source/blender/gpu/GPU_extensions.h
+++ b/source/blender/gpu/GPU_extensions.h
@@ -112,6 +112,9 @@ GPUTexture *GPU_texture_create_2D(int w, int h, float 
*pixels, char err_out[256]
 GPUTexture *GPU_texture_create_3D(int w, int h, int depth, int channels, float 
*fpixels);
 GPUTexture *GPU_texture_create_depth(int w, int h, char err_out[256]);
 GPUTexture *GPU_texture_create_vsm_shadow_map(int size, char err_out[256]);
+       // TODO
+GPUTexture *GPU_ptex_texture_from_blender(struct Image *ima,
+       struct ImageUser *iuser);
 GPUTexture *GPU_texture_from_blender(struct Image *ima,
        struct ImageUser *iuser, bool is_data, double time, int mipmap);
 GPUTexture *GPU_texture_from_preview(struct PreviewImage *prv, int mipmap);
diff --git a/source/blender/gpu/intern/gpu_codegen.c 
b/source/blender/gpu/intern/gpu_codegen.c
index 6d5fe6d..786f710 100644
--- a/source/blender/gpu/intern/gpu_codegen.c
+++ b/source/blender/gpu/intern/gpu_codegen.c
@@ -52,9 +52,7 @@
 
 #include "BKE_customdata.h"
 #include "BKE_DerivedMesh.h"
-#include "BKE_image.h"
-#include "IMB_imbuf_types.h"
-#include "IMB_imbuf.h"
+#include "BKE_ptex.h"
 
 #include "gpu_codegen.h"
 
@@ -827,39 +825,27 @@ void GPU_pass_bind(GPUPass *pass, double time, int mipmap,
        GPUShader *shader = pass->shader;
        ListBase *inputs = &pass->inputs;
 
-       DerivedMesh *dm = (ob && ob->derivedFinal) ? ob->derivedFinal : NULL;
-
        if (!shader)
                return;
 
        GPU_shader_bind(shader);
 
-       // TODO
+       // TODO: putting this here for now so that texture creation
+       // doesn't screw up bindings
        for (input=inputs->first; input; input=input->next) {
                if (input->ptex != 0) {
-                       ImBuf *imbuf = NULL;
-
-                       MTessFacePtex *ptex = 
CustomData_get_layer(&dm->faceData,
-                                                                               
                           CD_TESSFACE_PTEX);
-
-                       if (ptex) {
-                               imbuf = ptex[0].imbuf;
-                       }
-                       
-                       input->tex = 0;
-                       if (input->ptex == 1 && imbuf) {
-                               char err[256];
-                               IMB_float_from_rect(imbuf);
-                               input->tex = GPU_texture_create_2D(imbuf->x,
-                                                                               
                   imbuf->y,
-                                                                               
                   (float*)imbuf->rect_float,
-                                                                               
                   err);
-                       }
-                       else if (input->ptex == 2 && imbuf) {
-                               input->tex =
-                                       
GPU_texture_create_1D_float(imbuf->num_ptex_coords,
-                                                                               
                (float*)imbuf->ptex_coords,
-                                                                               
                NULL);
+                       // TODO: will pass a layer index or name here
+                       Image *image = BKE_ptex_mesh_image_get(ob);
+                       input->tex = NULL;
+                       if (image) {
+                               if (input->ptex == 1) {
+                                       input->tex = 
GPU_texture_from_blender(image,
+                                                                               
                                  NULL, false,
+                                                                               
                                  time, false);
+                               }
+                               else if (input->ptex == 2) {
+                                       input->tex = 
GPU_ptex_texture_from_blender(image, NULL);
+                               }
                        }
                }
        }
diff --git a/source/blender/gpu/intern/gpu_draw.c 
b/source/blender/gpu/intern/gpu_draw.c
index 500b53c..c63d0d0 100644
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@ -1288,6 +1288,11 @@ void GPU_free_image(Image *ima)
                ima->gputexture= NULL;
        }
 
+       if (ima->ptex_gputexture) {
+               GPU_texture_free(ima->ptex_gputexture);
+               ima->ptex_gputexture= NULL;
+       }
+
        /* free repeated image binding */
        if (ima->repbind) {
                glDeleteTextures(ima->totbind, (GLuint *)ima->repbind);
diff --git a/source/blender/gpu/intern/gpu_extensions.c 
b/source/blender/gpu/intern/gpu_extensions.c
index a6b711f..d106edf 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -49,6 +49,10 @@
 #include "GPU_extensions.h"
 #include "GPU_simple_shader.h"
 
+// TODO
+#include "BKE_image.h"
+#include "IMB_imbuf_types.h"
+
 #include "intern/gpu_extensions_private.h"
 
 #include <stdlib.h>
@@ -698,6 +702,38 @@ GPUTexture *GPU_texture_create_vsm_shadow_map(int size, 
char err_out[256])
        return tex;
 }
 
+// Very TODO, the code in this file could use a bit of a scrub
+GPUTexture *GPU_ptex_texture_from_blender(Image *ima, ImageUser *UNUSED(iuser))
+{
+
+       ImBuf *ibuf;
+       GPUTexture *tex;
+       int size;
+       float *data;
+       void *lock;
+
+       ibuf = BKE_image_acquire_ibuf(ima, NULL, &lock);
+       if (!ibuf) return NULL;
+
+       size = ibuf->num_ptex_coords;
+       data = (float*)ibuf->ptex_coords;
+
+       tex = GPU_texture_create_nD(size, 1, 2, NULL, 0, NULL);
+
+       if (tex) {
+               /* Now we tweak some of the settings */
+               /* glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 
GL_CLAMP_TO_EDGE); */
+               /* glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 
GL_CLAMP_TO_EDGE); */
+               glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, size, 1, 0, GL_RGBA, 
GL_FLOAT, data);
+
+               GPU_texture_unbind(tex);
+       }
+
+       BKE_image_release_ibuf(ima, ibuf, lock);
+
+       return tex;
+}
+
 void GPU_invalid_tex_init(void)
 {
        float color[4] = {1.0f, 0.0f, 1.0f, 1.0};
diff --git a/source/blender/makesdna/DNA_image_types.h 
b/source/blender/makesdna/DNA_image_types.h
index fcb894c..01b5377 100644
--- a/source/blender/makesdna/DNA_image_types.h
+++ b/source/blender/makesdna/DNA_image_types.h
@@ -81,6 +81,7 @@ typedef struct Image {
        
        struct MovieCache *cache;       /* not written in file */
        struct GPUTexture *gputexture;  /* not written in file */
+       struct GPUTexture *ptex_gputexture;     /* not written in file */
        
        /* sources from: */
        struct anim *anim;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to