void RenderThread::render(RenderRequest* req) { logFiner(QString("RenderThread::render : req 0x%1").arg((long)req,0,16)); if (req->type() == RenderRequest::Preview) { preview_request = req; // rendering a preview preempts everything except files and previews if (isRendering()) switch (current_request->type()) { case RenderRequest::Image: case RenderRequest::Queued: stopRendering(); default: ; } } else if (req->type() == RenderRequest::Image) image_request = req; else if (request_queue.contains(req)) logWarn(QString("RenderThread::render : req 0x%1 already queued") .arg((long)req,0,16)); else { logFine("RenderThread::render : queueing req %#x", (long)req); req->setFinished(false); rqueue_mutex.lock(); request_queue.enqueue(req); rqueue_mutex.unlock(); } }
void SkeletalMeshRenderer::render() { //should have an update check and recall set if updated. if(drawBuffers_.size() > 0 && isRendering()) { auto context = Sly::display->getContext(); auto display = Sly::display; const unsigned int stride = sizeof(MeshVertex); const unsigned int offset = 0; context->IASetInputLayout(inputLayout_); context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); display->setRasterizerState(rasterizerState_); display->setSamplerStates(samplerStates_); display->setBlendState(blendState_); display->setDepthStencilState(depthStencilState_); context->VSSetShader(vertexShader_, nullptr, 0); context->HSSetShader(hullShader_, nullptr, 0); context->DSSetShader(domainShader_, nullptr, 0); context->GSSetShader(geometryShader_, nullptr, 0); context->PSSetShader(pixelShader_, nullptr, 0); const auto meshTransform = (transform_) ? XMLoadFloat4x4(transform_) : XMMatrixIdentity(); //Default to identity if null (same for subMeshTransform) for(auto b = drawBuffers_.begin(); b != drawBuffers_.end(); ++b) { const auto subMeshTransform = ((*b)->transform) ? XMLoadFloat4x4((*b)->transform) : XMMatrixIdentity(); const auto transform = meshTransform * subMeshTransform; auto materialBuffer = display->getConstantBuffer("material"); auto worldBuffer = display->getConstantBuffer("world"); MaterialCB materialCB = { (*b)->material->diffuse, (*b)->material->specular }; materialBuffer->update(context, &materialCB , sizeof(MaterialCB)); WorldCB worldCB; XMStoreFloat4x4(&worldCB.world, transform); worldBuffer->update(context, &worldCB, sizeof(WorldCB)); context->VSSetConstantBuffers(0, 1, &worldBuffer->buffer); context->PSSetConstantBuffers(3, 1, &materialBuffer->buffer); context->VSSetConstantBuffers(0, 1, &worldBuffer->buffer); context->PSSetConstantBuffers(3, 1, &materialBuffer->buffer); ID3D11ShaderResourceView* srvs[4] = { (*b)->material->diffuseMap, (*b)->material->normalMap, (*b)->material->specularMap, (*b)->material->environmentMap}; context->PSSetShaderResources(0, 4, srvs); context->IASetVertexBuffers(0, 1, &(*b)->vertexBuffer, &stride, &offset ); //maybe able to group these together context->IASetIndexBuffer((*b)->indexBuffer, DXGI_FORMAT_R32_UINT, 0); context->DrawIndexed((*b)->drawCount, 0, 0); } } }
gboolean QDeclarativeVideoEditor::handleBusMessage (GstBus *, GstMessage *msg) { switch (GST_MESSAGE_TYPE (msg)) { case GST_MESSAGE_EOS: qDebug() << "End of stream"; setProgress(1.0); emit progressChanged(); gst_element_set_state ((GstElement *) m_pipeline, GST_STATE_PAUSED); if(isRendering()) { m_rendering = false; ges_timeline_pipeline_set_mode (m_pipeline, TIMELINE_MODE_PREVIEW); emit renderComplete(); } setProgress(-1.0); break; case GST_MESSAGE_ERROR: { gchar *debug; GError *gerror; gst_message_parse_error (msg, &gerror, &debug); g_free (debug); qDebug() << "Error: " << gerror->message; if(isRendering()) { m_rendering = false; emit error(RENDERING_FAILED, gerror->message); } else { emit error(PLAYBACK_FAILED, gerror->message); } g_error_free (gerror); gst_element_set_state ((GstElement *) m_pipeline, GST_STATE_NULL); setProgress(-1.0); break; } default: break; } return TRUE; }