Beispiel #1
0
void ImageBuffer::drawMarker(int x, int y, int red, int green, int blue, bool tiny) {
	if (tiny) {
		setPixelAt(x, y, red, green, blue);
	} else {
		setPixelAt(x - 1, y, red, green, blue);
		setPixelAt(x + 1, y, red, green, blue);
		setPixelAt(x, y - 1, red, green, blue);
		setPixelAt(x, y + 1, red, green, blue);
	}
}
Beispiel #2
0
void ImageBuffer::drawBox(int x, int y, int width, int height, int red, int green, int blue) {
    for (int i = x; i < x + width; i++) {
        setPixelAt(i, y, red, green, blue);
    }

    for (int i = x; i < x + width; i++) {
        setPixelAt(i, y + height, red, green, blue);
    }

    for (int i = y; i < y + height; i++) {
        setPixelAt(x, i, red, green, blue);
    }

    for (int i = y; i < y + height; i++) {
        setPixelAt(x + width, i, red, green, blue);
    }
}
Beispiel #3
0
void ImageBuffer::fillCircleCentered(int centerX, int centerY, int radius, int red, int green, int blue) {
	for (int x = -radius; x < radius; x++) {
		int height = (int)Math::sqrt(radius * radius - x * x);

		for (int y = -height; y < height; y++) {
			setPixelAt(x + centerX, y + centerY, red, green, blue);
		}
	}
}
Beispiel #4
0
void ImageBuffer::drawChar(int imageX, int imageY, int index) {
    int cols = 8;
    int rows = 8;
    const unsigned char* character = font[index];
    unsigned char row;

    for (int x = 0; x < cols; x++) {
		if (imageX + x > width) {
			break;
		}

        for (int y = 0; y < rows; y++) {
            row = character[x];

            if (row & (1 << y)) {
                setPixelAt(imageX + x, imageY - y + 8);
            }
        }
    }
}
Beispiel #5
0
void TrayTracer::generate(TrayTracer::Policy policy)
{
    for (int y = 0; y < m_bufferHeight; y++) {
        fprintf(stderr,"\rRendering: %5.2f%% .",100.0f*y/(m_bufferHeight));
        auto sy = 1- 1.0*y / m_bufferHeight;
        for (int x = 0; x < m_bufferWidth; x++) {
            auto sx = 1.0*x / m_bufferWidth;
            auto ray = camera()->generateRay(sx, sy);
            Tcolor color(0,0,0);
            switch(policy)
            {
            case Policy::CUSTOM:
                break;
            case Policy::DEPTH:
                color = handleDepth (ray);
                break;
            case Policy::DIRECT_LIGHT:
                break;
            case Policy::NORMAL:
                color = handleNormal(ray);
                break;
            case Policy::RAY_TRACING_EXPLICIT_LIGHT:
                color = radianceWithExplicitLight(ray,3);
                break;
            case Policy::PATH_TRACING:
            {
                int sampleNums = 200;
                for(int sampeIndex = 0; sampeIndex < sampleNums; sampeIndex ++)
                {
                    color += radiancePathTracer(ray,3) / (1.0f *sampleNums);
                }
            }
                break;
            }
            setPixelAt (x,y,color);
        }
    }
    printf("\nGenearted.\n");
}
Beispiel #6
0
void ImageBuffer::drawLine(int x1, int y1, int x2, int y2, int red, int green, int blue) {
    int F, x, y;

    if (x1 > x2) {
        std::swap(x1, x2);
        std::swap(y1, y2);
    }

    if (x1 == x2) {
        if (y1 > y2) {
            std::swap(y1, y2);
        }

        x = x1;
        y = y1;

        while (y <= y2) {
            setPixelAt(x, y, red, green, blue);

            y++;
        }

        return;
    } else if (y1 == y2) {
        x = x1;
        y = y1;

        while (x <= x2) {
            setPixelAt(x, y, red, green, blue);

            x++;
        }

        return;
    }

    int dy = y2 - y1;
    int dx = x2 - x1;
    int dy2 = (dy << 1);
    int dx2 = (dx << 1);
    int sub = dy2 - dx2;
    int sum = dy2 + dx2;

    if (dy >= 0) {
        if (dy <= dx) {
            F = dy2 - dx;
            x = x1;
            y = y1;

            while (x <= x2) {
                setPixelAt(x, y, red, green, blue);

                if (F <= 0) {
                    F += dy2;
                } else {
                    y++;
                    F += sub;
                }

                x++;
            }
        } else {
            F = dx2 - dy;
            y = y1;
            x = x1;

            while (y <= y2) {
                setPixelAt(x, y, red, green, blue);

                if (F <= 0) {
                    F += dx2;
                } else {
                    x++;
                    F -= sub;
                }

                y++;
            }
        }
    } else {
        if (dx >= -dy) {
            F = -dy2 - dx;
            x = x1;
            y = y1;

            while (x <= x2) {
                setPixelAt(x, y, red, green, blue);

                if (F <= 0) {
                    F -= dy2;
                } else {
                    y--;
                    F -= sum;
                }

                x++;
            }
        } else {
            F = dx2 + dy;
            y = y1;
            x = x1;

            while (y >= y2) {
                setPixelAt(x, y, red, green, blue);

                if (F <= 0) {
                    F += dx2;
                } else {
                    x++;
                    F += sum;
                }

                y--;
            }
        }
    }
}
Beispiel #7
0
/** Main */
int main(void) {

  /* Setup pins */
  DATA_DDR |= 0b11111100; // Data port
  DATA_PORT = DATA_PORT & 0b11;

  ADDR_DDR |= 0b1111; // Addr port
  ADDR_PORT = ADDR_PORT & 0b11110000;

  CTRL_DDR |= CTRL_MASK; // Ctrl port + debug led
  CTRL_PORT = (CTRL_PORT & ~CTRL_MASK) | CTRL_OE_PIN | CTRL_LAT_PIN;

  /* Init the framebuffer (all pixels black) */
  memset((void*) framebuffer, 0, MATRIX_SCANLINE_SIZE * NB_RESOLUTION_BITS * NB_VERTICAL_MATRIX * NB_COLUMNS_COUNT);
  
  /* Setup refresh timer (16 bits) */
  cli();
  TCCR1A = 0;                      // CTC mode
  TCCR1B = _BV(WGM12) | _BV(CS10); // No prescaler
  TCCR1C = 0;
  TCNT1 = 0;                       // Counter reset
  OCR1A = (F_CPU / 60 / 16 / ((1 << NB_RESOLUTION_BITS) - 1)) - 1; // ISR
  TIMSK1 = _BV(OCIE1A);            // Enable timer 1's compare match A ISR
  sei();
  
  /* Main loop */
  for(;;) {
  
    // Demo code
    static uint8_t x = 0;
    static uint8_t y = 0;
    static uint8_t r = 0;
    static uint8_t g = 0;
    static uint8_t b = 0;

    setPixelAt(x, y, r, g, b);

    if(++x == NB_COLUMNS_COUNT) {
      x = 0;

      if(++y == NB_LINES_COUNT) {
        y = 0;
      }
    }
	
	/* Draw color pattern */
#define COLOR_STEP 15
	if((r += COLOR_STEP) >= 256 - COLOR_STEP) {
      r = 0;
		  
	  if((g += COLOR_STEP) >= 256 - COLOR_STEP) {
        g = 0;
		  
		if((b += COLOR_STEP) >= 256 - COLOR_STEP) {
          b = 0;
        }
      }
    }

    // No flood delay
    _delay_ms(1);
  }
  
  /* Compiler fix */
  return 0;
}