Wednesday merger of Orange branch and bf-blender
authorTon Roosendaal <ton@blender.org>
Wed, 14 Dec 2005 14:24:23 +0000 (14:24 +0000)
committerTon Roosendaal <ton@blender.org>
Wed, 14 Dec 2005 14:24:23 +0000 (14:24 +0000)
source/blender/blenkernel/intern/action.c
source/blender/python/api2_2x/Image.c
source/blender/python/api2_2x/doc/Image.py

index c21a9463767290c9abb61990d2980e69f0357761..d6bca577013e609949527973e40a742e07bb4fad 100644 (file)
@@ -910,8 +910,10 @@ static void do_nla(Object *ob, int blocktype)
                                else{
                                        if (strip->flag & ACTSTRIP_HOLDLASTFRAME){
                                                /* we want the strip to hold on the exact fraction of the repeat value */
+                                               
                                                frametime = actlength * (strip->repeat-(int)strip->repeat);
-                                               frametime= bsystem_time(ob, 0, frametime, 0.0);
+                                               if(frametime<=0.000001f) frametime= actlength;  /* rounding errors... */
+                                               frametime= bsystem_time(ob, 0, frametime+strip->actstart, 0.0);
                                                
                                                if(blocktype==ID_AR)
                                                        extract_pose_from_action (tpose, strip->act, frametime);
index 70f69ac840ba1550aa31f78ab9b5ab0a30bb76c6..ffd129f303ad9e88faeaea00e24062023f1f80a1 100644 (file)
@@ -66,8 +66,7 @@ short IMB_saveiff( struct ImBuf *ibuf, char *naam, int flags );
 /*****************************************************************************/
 /* Python API function prototypes for the Image module.         */
 /*****************************************************************************/
-/*static PyObject *M_Image_New( PyObject * self, PyObject * args,
-                             PyObject * keywords );*/
+static PyObject *M_Image_New( PyObject * self, PyObject * args );
 static PyObject *M_Image_Get( PyObject * self, PyObject * args );
 static PyObject *M_Image_GetCurrent( PyObject * self );
 static PyObject *M_Image_Load( PyObject * self, PyObject * args );
@@ -79,8 +78,8 @@ static PyObject *M_Image_Load( PyObject * self, PyObject * args );
 /*****************************************************************************/
 static char M_Image_doc[] = "The Blender Image module\n\n";
 
-/*static char M_Image_New_doc[] =
-       "() - return a new Image object -- unimplemented";*/
+static char M_Image_New_doc[] =
+       "() - return a new Image object";
 
 static char M_Image_Get_doc[] =
        "(name) - return the image with the name 'name', \
@@ -99,26 +98,40 @@ returns None if not found.\n";
 /* Python method structure definition for Blender.Image module:                 */
 /*****************************************************************************/
 struct PyMethodDef M_Image_methods[] = {
-       /*{"New", ( PyCFunction ) M_Image_New, METH_VARARGS | METH_KEYWORDS,
-          M_Image_New_doc}, */
-       {"Get", (PyCFunction) M_Image_Get, METH_VARARGS, M_Image_Get_doc},
-       {"GetCurrent", (PyCFunction) M_Image_GetCurrent, METH_NOARGS, M_Image_GetCurrent_doc},
-       {"get", (PyCFunction) M_Image_Get, METH_VARARGS, M_Image_Get_doc},
-       {"Load", (PyCFunction) M_Image_Load, METH_VARARGS, M_Image_Load_doc},
+       {"New", M_Image_New, METH_VARARGS, M_Image_New_doc},
+       {"Get", M_Image_Get, METH_VARARGS, M_Image_Get_doc},
+       {"GetCurrent", M_Image_GetCurrent, METH_NOARGS, M_Image_GetCurrent_doc},
+       {"get", M_Image_Get, METH_VARARGS, M_Image_Get_doc},
+       {"Load", M_Image_Load, METH_VARARGS, M_Image_Load_doc},
        {NULL, NULL, 0, NULL}
 };
 
+
 /*****************************************************************************/
-/* Function:   M_Image_New      (unimplemented) */
-/* Python equivalent:          Blender.Image.New    */
+/* Function:    M_Image_New     */
+/* Python equivalent:        Blender.Image.New    */
 /*****************************************************************************/
-/*static PyObject *M_Image_New( PyObject * self, PyObject * args,
-       PyObject * keywords )
+static PyObject *M_Image_New( PyObject * self, PyObject * args)
 {
-       Py_INCREF( Py_None );
-       return Py_None;
+       int width, height, depth;
+       char *name;
+       Image *img;
+       if( !PyArg_ParseTuple( args, "siii", &name, &width, &height, &depth ) )
+               return ( EXPP_ReturnPyObjError( PyExc_TypeError,
+                                       "expected 1 string and 3 ints" ) );
+       if (width > 5000 || height > 5000 || width < 1 || height < 1)
+               return ( EXPP_ReturnPyObjError( PyExc_TypeError,
+                                       "Image width and height must be between 1 and 5000" ) );
+       img = new_image(width, height, name, 0);
+       if( !img )
+               return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
+                                               "couldn't create PyObject Image_Type" ) );
+       image_changed(img, 0);
+       return Image_CreatePyObject( img );
 }
-*/
+
+
+
 /*****************************************************************************/
 /* Function:           M_Image_Get      */
 /* Python equivalent:  Blender.Image.Get   */
@@ -189,7 +202,7 @@ static PyObject *M_Image_Get( PyObject * self, PyObject * args )
 
 
 /*****************************************************************************/
-/* Function:           M_Image_GetCurrent       */
+/* Function:           M_Image_GetCurrent*/
 /* Python equivalent:  Blender.Image.GetCurrent   */
 /* Description:                Returns the active current (G.sima)      */
 /*                     This will be the image last under the mouse cursor */
@@ -197,17 +210,14 @@ static PyObject *M_Image_Get( PyObject * self, PyObject * args )
 /*****************************************************************************/
 static PyObject *M_Image_GetCurrent( PyObject * self )
 {
-       PyObject *current_img;
        if (!G.sima || !G.sima->image) {
                Py_RETURN_NONE;
        }
-       current_img = Image_CreatePyObject( G.sima->image );
-       return current_img;
+       return Image_CreatePyObject( G.sima->image );
 }
 
 
 
-
 /*****************************************************************************/
 /* Function:   M_Image_Load             */
 /* Python equivalent:  Blender.Image.Load   */
@@ -574,10 +584,16 @@ static PyObject *Image_getDepth( BPy_Image * self );
 static PyObject *Image_getXRep( BPy_Image * self );
 static PyObject *Image_getYRep( BPy_Image * self );
 static PyObject *Image_getBindCode( BPy_Image * self );
+static PyObject *Image_getStart( BPy_Image * self );
+static PyObject *Image_getEnd( BPy_Image * self );
+static PyObject *Image_getSpeed( BPy_Image * self );
 static PyObject *Image_setName( BPy_Image * self, PyObject * args );
 static PyObject *Image_setFilename( BPy_Image * self, PyObject * args );
 static PyObject *Image_setXRep( BPy_Image * self, PyObject * args );
 static PyObject *Image_setYRep( BPy_Image * self, PyObject * args );
+static PyObject *Image_setStart( BPy_Image * self, PyObject * args );
+static PyObject *Image_setEnd( BPy_Image * self, PyObject * args );
+static PyObject *Image_setSpeed( BPy_Image * self, PyObject * args );
 static PyObject *Image_reload( BPy_Image * self );
 static PyObject *Image_glLoad( BPy_Image * self );
 static PyObject *Image_glFree( BPy_Image * self );
@@ -619,6 +635,12 @@ static PyMethodDef BPy_Image_methods[] = {
         "() - Return Image object x repetition value"},
        {"getYRep", ( PyCFunction ) Image_getYRep, METH_NOARGS,
         "() - Return Image object y repetition value"},
+       {"getStart", ( PyCFunction ) Image_getStart, METH_NOARGS,
+        "() - Return Image object start frame."},
+       {"getEnd", ( PyCFunction ) Image_getEnd, METH_NOARGS,
+        "() - Return Image object end frame."},
+       {"getSpeed", ( PyCFunction ) Image_getSpeed, METH_NOARGS,
+        "() - Return Image object speed (fps)."},
        {"getBindCode", ( PyCFunction ) Image_getBindCode, METH_NOARGS,
         "() - Return Image object's bind code value"},
        {"reload", ( PyCFunction ) Image_reload, METH_NOARGS,
@@ -637,6 +659,12 @@ static PyMethodDef BPy_Image_methods[] = {
         "(int) - Change Image object x repetition value"},
        {"setYRep", ( PyCFunction ) Image_setYRep, METH_VARARGS,
         "(int) - Change Image object y repetition value"},
+       {"setStart", ( PyCFunction ) Image_setStart, METH_VARARGS,
+        "(int) - Change Image object animation start value"},
+       {"setEnd", ( PyCFunction ) Image_setEnd, METH_VARARGS,
+        "(int) - Change Image object animation end value"},
+       {"setSpeed", ( PyCFunction ) Image_setEnd, METH_VARARGS,
+        "(int) - Change Image object animation speed (fps)"},
        {"save", ( PyCFunction ) Image_save, METH_NOARGS,
         "() - Write image buffer to file"},
        {NULL, NULL, 0, NULL}
@@ -816,6 +844,39 @@ static PyObject *Image_getYRep( BPy_Image * self )
                                      "couldn't get Image.yrep attribute" );
 }
 
+static PyObject *Image_getStart( BPy_Image * self )
+{
+       PyObject *attr = PyInt_FromLong( self->image->twsta );
+
+       if( attr )
+               return attr;
+
+       return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+                                     "couldn't get Image.start attribute" );
+}
+
+static PyObject *Image_getEnd( BPy_Image * self )
+{
+       PyObject *attr = PyInt_FromLong( self->image->twend );
+
+       if( attr )
+               return attr;
+
+       return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+                                     "couldn't get Image.end attribute" );
+}
+
+static PyObject *Image_getSpeed( BPy_Image * self )
+{
+       PyObject *attr = PyInt_FromLong( self->image->animspeed );
+
+       if( attr )
+               return attr;
+
+       return EXPP_ReturnPyObjError( PyExc_RuntimeError,
+                                     "couldn't get Image.speed attribute" );
+}
+
 static PyObject *Image_getBindCode( BPy_Image * self )
 {
        PyObject *attr = PyLong_FromUnsignedLong( self->image->bindcode );
@@ -960,6 +1021,59 @@ static PyObject *Image_setYRep( BPy_Image * self, PyObject * args )
        Py_RETURN_NONE;
 }
 
+
+static PyObject *Image_setStart( BPy_Image * self, PyObject * args )
+{
+       short value;
+
+       if( !PyArg_ParseTuple( args, "h", &value ) )
+               return ( EXPP_ReturnPyObjError( PyExc_TypeError,
+                                               "expected int argument in [0,128]" ) );
+
+       if( value >= 0 && value <= 128 )
+               self->image->twsta = value;
+       else
+               return ( EXPP_ReturnPyObjError( PyExc_ValueError,
+                                               "expected int argument in [0,128]" ) );
+
+       Py_RETURN_NONE;
+}
+
+
+static PyObject *Image_setEnd( BPy_Image * self, PyObject * args )
+{
+       short value;
+
+       if( !PyArg_ParseTuple( args, "h", &value ) )
+               return ( EXPP_ReturnPyObjError( PyExc_TypeError,
+                                               "expected int argument in [0,128]" ) );
+
+       if( value >= 0 && value <= 128 )
+               self->image->twend = value;
+       else
+               return ( EXPP_ReturnPyObjError( PyExc_ValueError,
+                                               "expected int argument in [0,128]" ) );
+
+       Py_RETURN_NONE;
+}
+
+static PyObject *Image_setSpeed( BPy_Image * self, PyObject * args )
+{
+       short value;
+
+       if( !PyArg_ParseTuple( args, "h", &value ) )
+               return ( EXPP_ReturnPyObjError( PyExc_TypeError,
+                                               "expected int argument in [0,128]" ) );
+
+       if( value >= 1 && value <= 100 )
+               self->image->animspeed = value;
+       else
+               return ( EXPP_ReturnPyObjError( PyExc_ValueError,
+                                               "expected int argument in [0,128]" ) );
+
+       Py_RETURN_NONE;
+}
+
 /*****************************************************************************/
 /* Function:           Image_getAttr            */
 /* Description: This is a callback function for the BPy_Image type. It is */
@@ -982,14 +1096,31 @@ static PyObject *Image_getAttr( BPy_Image * self, char *name )
                attr = PyInt_FromLong( self->image->xrep );
        else if( strcmp( name, "yrep" ) == 0 )
                attr = PyInt_FromLong( self->image->yrep );
-       else if( strcmp( name, "bindcode" ) == 0 )
+       else if( strcmp( name, "start" ) == 0 )
+               attr = PyInt_FromLong( self->image->twsta );
+       else if( strcmp( name, "end" ) == 0 )
+               attr = PyInt_FromLong( self->image->twend );
+       else if( strcmp( name, "speed" ) == 0 )
+               attr = PyInt_FromLong( self->image->animspeed );
+       else if( strcmp( name, "packed" ) == 0 ) {
+               if (self->image->packedfile)  {
+                       //Py_INCREF(Py_True);
+                       attr = Py_True;
+               } else {
+                       //Py_INCREF(Py_False);
+                       attr = Py_False;
+               }
+               
+       } else if( strcmp( name, "bindcode" ) == 0 )
                attr = PyInt_FromLong( self->image->bindcode );
        else if( strcmp( name, "users" ) == 0 )
                attr = PyInt_FromLong( self->image->id.us );
        else if( strcmp( name, "__members__" ) == 0 )
-               attr = Py_BuildValue( "[s,s,s,s,s,s,s,s]",
+               attr = Py_BuildValue( "[s,s,s,s,s,s,s,s,s,s,s]",
                                      "name", "filename", "size", "depth",
-                                     "xrep", "yrep", "bindcode", "users" );
+                                     "xrep", "yrep", "start", "end",
+                                     "speed", "packed",
+                                     "bindcode", "users" );
 
        if( !attr )
                return ( EXPP_ReturnPyObjError( PyExc_MemoryError,
@@ -1032,6 +1163,12 @@ static int Image_setAttr( BPy_Image * self, char *name, PyObject * value )
                error = Image_setXRep( self, valtuple );
        else if( strcmp( name, "yrep" ) == 0 )
                error = Image_setYRep( self, valtuple );
+       else if( strcmp( name, "start" ) == 0 )
+               error = Image_setStart( self, valtuple );
+       else if( strcmp( name, "end" ) == 0 )
+               error = Image_setEnd( self, valtuple );
+       else if( strcmp( name, "speed" ) == 0 )
+               error = Image_setSpeed( self, valtuple );
        else {                  /* Error: no such member in the Image object structure */
                /*Py_DECREF( value ); borrowed ref, no need to decref */
                Py_DECREF( valtuple );
index 1d25c550b3d26db6dc48162ab89ce6028f343a47..7129075e10c23fe5e10e7830b94b2d4576b1fab4 100644 (file)
@@ -31,14 +31,19 @@ def Load (filename):
   @return: A Blender Image object with the data from I{filename}.
   """
 
-def New (name):
+def New (name, width, height, depth):
   """
-  Create a new Image object (not implemented yet!).
+  Create a new Image object.
   @type name: string
   @param name: The name of the new Image object.
+  @type width: int
+  @param width: The width of the new Image object, between 1 and 5000.
+  @type height: int
+  @param height: The height of the new Image object, between 1 and 5000.
+  @type depth: int
+  @param depth: The colour depth of the new Image object. (8:Grey, 24:RGB, 32:RGBA). (Not implimented yet, all new images will be 24bit)
   @rtype: Blender Image
   @return: A new Blender Image object.
-  @warn: This function wasn't implemented yet.  It simply returns None.
   """
 
 def Get (name = None):
@@ -74,6 +79,10 @@ class Image:
      axis.
   @ivar yrep: Texture tiling: the number of repetitions in the y (vertical)
      axis.
+  @ivar start: Texture's animation start frame [0, 128].
+  @ivar end: Texture's animation end frame [0, 128].
+  @ivar speed: Texture's animation speed [1, 100].
+  @ivar packed: Boolean, True whe the Texture is packed (readonly).
   @ivar bindcode: Texture's bind code (readonly).
   """
 
@@ -161,6 +170,24 @@ class Image:
     @rtype: int
     """
 
+  def getStart():
+    """
+    Get the Image's start frame. Used for animated textures.
+    @rtype: int
+    """
+
+  def getEnd():
+    """
+    Get the Image's end frame. Used for animated textures.
+    @rtype: int
+    """
+
+  def getSpeed():
+    """
+    Get the Image's speed (fps). Used for animated textures.
+    @rtype: int
+    """
+
   def reload():
     """
     Reloads this image from the filesystem.  If used within a loop you need to
@@ -224,6 +251,27 @@ class Image:
     @param yrep: The new value in [1, 16].
     """
 
+  def setStart(start):
+    """
+    Get the Image's start frame. Used for animated textures.
+    @type start: int
+    @param start: The new value in [0, 128].
+    """
+
+  def setEnd(end):
+    """
+    Set the Image's end frame. Used for animated textures.
+    @type end: int
+    @param end: The new value in [0, 128].
+    """
+
+  def setSpeed(speed):
+    """
+    Set the Image's speed (fps). Used for animated textures.
+    @type speed: int
+    @param speed: The new value in [1, 100].
+    """
+
   def setPixelF(x, y, (r, g, b,a )):
     """
                Set the the colors of the current pixel in the form [r,g,b,a].