Example #1
0
// store pixel information
void BlenderImage::StorePixel( int x , int y , const Spectrum& color , const RenderTask& rt )
{
	if (!m_sharedMemory.bytes)
		return;

	int tile_w = rt.size.x;
	int tile_size = g_iTileSize * g_iTileSize;
	int x_off = (int)(rt.ori.x / g_iTileSize);
	int y_off = (int)(floor((m_height - 1 - rt.ori.y) / (float)g_iTileSize));
	int tile_offset = y_off * m_tilenum_x + x_off;
	int offset = 4 * tile_offset * tile_size;

	// get the data pointer
	float* data = (float*)(m_sharedMemory.bytes + m_header_offset);

	// get offset
	int inner_offset = offset + 4 * (x - rt.ori.x + (g_iTileSize - 1 - (y - rt.ori.y)) * tile_w);

	// copy data
	data[ inner_offset ] = color.GetR();
	data[ inner_offset + 1 ] = color.GetG();
	data[ inner_offset + 2 ] = color.GetB();
	data[ inner_offset + 3 ] = 1.0f;

	// for final update
	m_mutex[x][y].Lock();
	Spectrum _color = m_rendertarget.GetColor(x,y);
	m_rendertarget.SetColor(x, y, color+_color);
	m_mutex[x][y].Unlock();
}