hello, before possible inclusion in Gem, the help patch should be better (have a look at the other gem help patch).
i noticed that changing colorspace is done with "colorspace YUV" while in pix_set this is made with only a "YUV" message
i also think that every noise generator should have a "seed" input in order to be able to have predictible output.
last point : it is very necessary to have a mode where the noise does not change at every frame. i personnaly think it should be defaut. computing a new frame could be made by sending a bang, or by sending a new seed by exemple.
just my 2 cents
Cyrille
Thomas Holzmann a écrit :
Hello!
Georg Holzmann schrieb:
chris clepper schrieb:
Is this a random noise or Perlin noise object?
Only random noise ATM.
Here is my (very simple) random noise object for gem. Cris, if you think its useful you could add it to the main branch.
Thomas
#N canvas 42 78 561 477 10; #X obj 30 -36 cnv 15 100 60 empty empty empty 20 12 0 14 -195568 -66577 0; #N canvas 0 0 450 300 gemwin 0; #X obj 132 136 gemwin; #X obj 67 89 outlet; #X obj 67 10 inlet; #X msg 67 70 set destroy; #X msg 132 112 create , 1; #X msg 198 112 destroy; #X msg 156 71 set create; #X obj 67 41 route create; #X connect 2 0 7 0; #X connect 3 0 1 0; #X connect 4 0 0 0; #X connect 5 0 0 0; #X connect 6 0 1 0; #X connect 7 0 3 0; #X connect 7 0 4 0; #X connect 7 1 6 0; #X connect 7 1 5 0; #X restore 35 3 pd gemwin; #X msg 35 -16 destroy; #X text 31 -37 Create window:; #X obj 193 40 gemhead; #X obj 196 225 pix_texture; #X obj 196 247 rectangle 4 3; #X msg 266 50 dimen 600 400; #X msg 283 82 dimen 300 200; #X msg 290 114 dimen 60 40; #X obj 201 169 pix_noise 40 30; #X msg 376 159 colorspace YUV; #X msg 378 191 colorspace GRAY; #X msg 381 132 colorspace RGBA; #X connect 1 0 2 0; #X connect 2 0 1 0; #X connect 4 0 10 0; #X connect 5 0 6 0; #X connect 7 0 10 0; #X connect 8 0 10 0; #X connect 9 0 10 0; #X connect 10 0 5 0; #X connect 11 0 10 0; #X connect 12 0 10 0; #X connect 13 0 10 0;
//////////////////////////////////////////////////////// // // GEM - Graphics Environment for Multimedia // // zmoelnig@iem.kug.ac.at // // Implementation file // // Copyright (c) 1997-2000 Mark Danks. // Copyright (c) Gï¿Ånther Geiger. // Copyright (c) 2001-2002 IOhannes m zmoelnig. forum::fï¿År::umlï¿Åute. IEM // Copyright (c) 2002 James Tittle & Chris Clepper // For information on usage and redistribution, and for a DISCLAIMER OF ALL // WARRANTIES, see the file, "GEM.LICENSE.TERMS" in this distribution. // /////////////////////////////////////////////////////////
#include "pix_noise.h"
CPPEXTERN_NEW_WITH_TWO_ARGS(pix_noise, t_float, A_DEFFLOAT, t_float, A_DEFFLOAT)
///////////////////////////////////////////////////////// // // pix_noise // ///////////////////////////////////////////////////////// // Constructor // ///////////////////////////////////////////////////////// pix_noise :: pix_noise(t_float w, t_float h) : m_reqFormat(GL_YUV422_GEM) { m_width = (int) w; m_height = (int) h; createFrame(); }
///////////////////////////////////////////////////////// // Destructor // ///////////////////////////////////////////////////////// pix_noise :: ~pix_noise() { m_pixBlock.image.clear(); }
///////////////////////////////////////////////////////// // createNoise // ///////////////////////////////////////////////////////// void pix_noise :: produceNoise() { unsigned char *data = m_pixBlock.image.data; int n = m_width * m_height;
switch(m_pixBlock.image.format){ case GL_RGBA: default: while(n--){ data[chRed] = rand() % 256; data[chGreen] = rand() % 256; data[chBlue] = rand() % 256; data[chAlpha] = 0; data+=4; } break; case GL_YUV422_GEM: n/=2; while(n--) { data[chY0] = rand() % 256; data[chY1] = rand() % 256; data[chU ] = rand() % 256; data[chV ] = rand() % 256;
data+=4; } break; case GL_LUMINANCE: while(n--){ *data++ = rand() % 256; } break;
}
m_pixBlock.newimage = 1; }
void pix_noise :: render(GemState *state) { produceNoise(); state->image = &m_pixBlock; }
void pix_noise:: postrender(GemState *state) { m_pixBlock.newimage = 0; state->image = NULL; }
void pix_noise:: startRendering() { m_pixBlock.newimage = 1; }
void pix_noise::createFrame() { // check bounds m_width = (m_width<=0) ? 8 : m_width; m_width = (m_width>10000) ? 400 : m_width; m_height = (m_height<=0) ? 8 : m_height; m_height = (m_height>10000) ? 300 : m_height;
m_pixBlock.image.xsize = m_width; m_pixBlock.image.ysize = m_height; m_pixBlock.image.setCsizeByFormat(m_reqFormat);
m_pixsize = m_pixBlock.image.xsize*m_pixBlock.image.ysize; m_pixBlock.image.reallocate(); m_pixBlock.image.setBlack(); }
void pix_noise::setDimension(int w, int h) { m_width = w; m_height = h; createFrame(); }
void pix_noise::csMess(GLint cs) { m_reqFormat=cs; m_pixBlock.image.setCsizeByFormat(m_reqFormat); m_pixsize = m_pixBlock.image.xsize*m_pixBlock.image.ysize; m_pixBlock.image.reallocate(); m_pixBlock.image.setBlack(); }
///////////////////////////////////////////////////////// // static member function // /////////////////////////////////////////////////////////
void pix_noise :: obj_setupCallback(t_class *classPtr) { class_addcreator((t_newmethod)_classpix_noise, gensym("pix_noise"), A_NULL); class_addmethod(classPtr,(t_method)pix_noise::dimenCallback, gensym("dimen"), A_DEFFLOAT, A_DEFFLOAT,A_NULL); class_addmethod(classPtr, (t_method)&pix_noise::csMessCallback, gensym("colorspace"), A_DEFSYMBOL, A_NULL); }
void pix_noise::dimenCallback(void *data, float x, float y) { GetMyClass(data)->setDimension((int)x, (int)y); }
void pix_noise ::csMessCallback(void *data, t_symbol *s) { int cs = getPixFormat(s->s_name); if(cs>0)GetMyClass(data)->csMess(cs); else GetMyClass(data)->error("pix_noise: colorspace must be Grey, YUV or RGBA"); }
/*----------------------------------------------------------------- LOG GEM - Graphics Environment for Multimedia
Change pix to greyscale Copyright (c) 1997-1999 Mark Danks. mark@danks.org Copyright (c) Gï¿Ånther Geiger. geiger@epy.co.at Copyright (c) 2001-2002 IOhannes m zmoelnig. forum::fï¿År::umlï¿Åute. IEM. zmoelnig@iem.kug.ac.at Copyright (c) 2002 James Tittle & Chris Clepper For information on usage and redistribution, and for a DISCLAIMER OF ALL WARRANTIES, see the file, "GEM.LICENSE.TERMS" in this distribution.
-----------------------------------------------------------------*/
#ifndef INCLUDE_PIX_NOISE_H_ #define INCLUDE_PIX_NOISE_H_
const int RGBA_SIZE = 4; //const int X_SIZE = 100; //const int Y_SIZE = 100;
#include "Base/GemBase.h" #include "Base/GemPixUtil.h"
/*-----------------------------------------------------------------
CLASS pix_noise
Creates noise
KEYWORDS pix
DESCRIPTION
-----------------------------------------------------------------*/ class GEM_EXTERN pix_noise : public GemBase { CPPEXTERN_HEADER(pix_noise, GemBase)
public:
////////// // Constructor pix_noise(t_float w, t_float h); protected: ////////// // Destructor virtual ~pix_noise();
////////// // A frame will be created virtual void produceNoise(); ////////// // Do the rendering virtual void render(GemState *state) ; ////////// // Clear the dirty flag on the pixBlock virtual void postrender(GemState *state) ; ////////// virtual void startRendering() ; ///////// // allocates Frame virtual void createFrame(); ////////// // setting dimension and colourspace virtual void setDimension(int w, int h); virtual void csMess(GLint cs);
private:
////////// // The pixBlock with the current image pixBlock m_pixBlock; int m_pixsize; int m_width, m_height; ////////////// // which colorspace do we want ? currently only GL_RGBA GLint m_reqFormat;
private: ////////// // static member functions static void dimenCallback(void *data, float x, float y); static void csMessCallback(void *data, t_symbol*s); };
#endif // for header file
GEM-dev mailing list GEM-dev@iem.at http://lists.puredata.info/listinfo/gem-dev