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); } }
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); } }
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); } } }
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); } } } }
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"); }
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--; } } } }
/** 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; }