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