Hello World plugin: update()

From Second Life Wiki
Jump to navigation Jump to search

<cpp>

  ...
  if ( mFirstTime )
  {
     // Clear previous pixel array

delete [] mBackgroundPixels;

     // Create array of pixels

mBackgroundPixels = new unsigned char[ getSurfaceSize() ];

mFirstTime = false;

     // Square beginning color
     squareR = 0;
     squareG = 0x88;
     squareB = 0x88;

     squareWidth = 0x80;
     squareHeight = 0x80;

     // Start position of square is 0,0
     squareXpos = 0;
     squareYpos = 0;

     // Determine the square's initial movement direction
     randomizeDirection();

  };

  // Check for browser stop button input
  if ( mStopAction )
     return;

  if ( time( NULL ) > mLastUpdateTime + 1 )
  {
     // Draw black background
     int bkgnd_r = 0;
     int bkgnd_g = 0;
     int bkgnd_b = 0;
     for (int bkgnd_pix = 0; bkgnd_pix < getSurfaceSize(); bkgnd_pix = bkgnd_pix+mDepth)
     {
        mBackgroundPixels [bkgnd_pix + 0] = bkgnd_r;
        mBackgroundPixels [bkgnd_pix + 1] = bkgnd_g;
        mBackgroundPixels [bkgnd_pix + 2] = bkgnd_b;
     }
   
     // Set the color of the moving square
     squareR = (squareR+1) % (0xFF-0x20) + 0x20;
     squareG = (squareG+7) % (0xFF-0x20) + 0x20;
     squareB = (squareB+7) % (0xFF-0x20) + 0x20;
   
     time( &mLastUpdateTime );

  }
  memcpy( mPixels, mBackgroundPixels, getSurfaceSize() );

  // Black out last position of square
  for ( int xcnt = 0; xcnt < squareWidth; ++xcnt )
  {
     for ( int ycnt = 0; ycnt < squareHeight; ++ycnt )
     {
        mPixels [ (squareXpos + xcnt)*mDepth + (squareYpos + ycnt)*mWidth*mDepth + 0 ] = 0;
        mPixels [ (squareXpos + xcnt)*mDepth + (squareYpos + ycnt)*mWidth*mDepth + 1 ] = 0;
        mPixels [ (squareXpos + xcnt)*mDepth + (squareYpos + ycnt)*mWidth*mDepth + 2 ] = 0;
     }
  }
  // Calculate the new position of the moving square. Note: (0,0) is the top left corner.
  //
  if (rand() % 400 == 0) // only change direction once in a while
  {
     randomizeDirection();
  }

  if ((squareXpos + squareXinc < 0) || (squareXpos + squareXinc >= mWidth - squareWidth))
     squareXinc = -squareXinc;

  if ((squareYpos + squareYinc < 0) || (squareYpos + squareYinc >= mHeight - squareHeight))
     squareYinc = -squareYinc;

  squareXpos += squareXinc;
  squareYpos += squareYinc;

  // Draw square
  for ( int xcnt = 0; xcnt < squareWidth; ++xcnt )
  {
     for ( int ycnt = 0; ycnt < squareHeight; ++ycnt )
     {
        mPixels [ (squareXpos + xcnt)*mDepth + (squareYpos + ycnt)*mWidth*mDepth + 0 ] = squareR;
        mPixels [ (squareXpos + xcnt)*mDepth + (squareYpos + ycnt)*mWidth*mDepth + 1 ] = squareG;
        mPixels [ (squareXpos + xcnt)*mDepth + (squareYpos + ycnt)*mWidth*mDepth + 2 ] = squareB;
     }
  }

  setDirty( 0, 0, mWidth, mHeight );
  ...

</cpp>