void LightCore::syncToCore(const CoreSyncData& data) { char* dataPtr = (char*)data.getBuffer(); UINT32 dirtyFlags = 0; bool oldIsActive = mIsActive; LightType oldType = mType; dataPtr = rttiReadElem(mPosition, dataPtr); dataPtr = rttiReadElem(mRotation, dataPtr); dataPtr = rttiReadElem(mType, dataPtr); dataPtr = rttiReadElem(mCastsShadows, dataPtr); dataPtr = rttiReadElem(mColor, dataPtr); dataPtr = rttiReadElem(mRange, dataPtr); dataPtr = rttiReadElem(mIntensity, dataPtr); dataPtr = rttiReadElem(mSpotAngle, dataPtr); dataPtr = rttiReadElem(mSpotFalloffAngle, dataPtr); dataPtr = rttiReadElem(mPhysCorrectAtten, dataPtr); dataPtr = rttiReadElem(mIsActive, dataPtr); dataPtr = rttiReadElem(dirtyFlags, dataPtr); dataPtr = rttiReadElem(mBounds, dataPtr); updateBounds(); if (dirtyFlags == (UINT32)LightDirtyFlag::Transform) { if (mIsActive) gRenderer()->notifyLightUpdated(this); } else { if (oldIsActive != mIsActive) { if (mIsActive) gRenderer()->notifyLightAdded(this); else { LightType newType = mType; mType = oldType; gRenderer()->notifyLightRemoved(this); mType = newType; } } else { LightType newType = mType; mType = oldType; gRenderer()->notifyLightRemoved(this); mType = newType; gRenderer()->notifyLightAdded(this); } } }
void LightCore::initialize() { updateBounds(); gRenderer()->notifyLightAdded(this); CoreObjectCore::initialize(); }
void RendererTask::wait() { // Task is about to be executed outside of normal rendering workflow. Make sure to manually sync all changes to // the core thread first. // Note: wait() might only get called during serialization, in which case we might call these methods just once // before a level save, instead for every individual component gSceneManager()._updateCoreObjectTransforms(); CoreObjectManager::instance().syncToCore(); auto worker = [this]() { gRenderer()->processTask(*this, true); }; gCoreThread().queueCommand(worker); gCoreThread().submit(true); // Note: Tigger on complete callback and clear it from Renderer? }
void SelectionRendererCore::render(const Camera& camera) { THROW_IF_NOT_CORE_THREAD; const RendererAnimationData& animData = AnimationManager::instance().getRendererData(); Matrix4 viewProjMat = mCamera->getProjectionMatrixRS() * mCamera->getViewMatrix(); SPtr<Renderer> renderer = gRenderer(); for (auto& renderable : mObjects) { SPtr<Mesh> mesh = renderable->getMesh(); if (mesh == nullptr) continue; SPtr<GpuBuffer> boneMatrixBuffer = renderable->getBoneMatrixBuffer(); SPtr<VertexBuffer> morphShapeBuffer = renderable->getMorphShapeBuffer(); SPtr<VertexDeclaration> morphVertexDeclaration = renderable->getMorphVertexDeclaration(); Matrix4 worldViewProjMat = viewProjMat * renderable->getTransform(); UINT32 techniqueIdx = mTechniqueIndices[(int)renderable->getAnimType()]; mMatWorldViewProj[techniqueIdx].set(worldViewProjMat); mColor[techniqueIdx].set(SELECTION_COLOR); mBoneMatrices[techniqueIdx].set(boneMatrixBuffer); gRendererUtility().setPass(mMaterial, 0, techniqueIdx); gRendererUtility().setPassParams(mParams[techniqueIdx], 0); UINT32 numSubmeshes = mesh->getProperties().getNumSubMeshes(); for (UINT32 i = 0; i < numSubmeshes; i++) { if (morphVertexDeclaration == nullptr) gRendererUtility().draw(mesh, mesh->getProperties().getSubMesh(i)); else gRendererUtility().drawMorph(mesh, mesh->getProperties().getSubMesh(i), morphShapeBuffer, morphVertexDeclaration); } } }
// This routine draws the actual planes. int XPMPRenderMultiplayerPlanes( XPLMDrawingPhase inPhase, int inIsBefore, void * inRefcon) { static int is_blend = 0; static XPLMDataRef wrt = XPLMFindDataRef("sim/graphics/view/world_render_type"); static XPLMDataRef prt = XPLMFindDataRef("sim/graphics/view/plane_render_type"); int is_shadow = wrt != NULL && XPLMGetDatai(wrt) != 0; if(prt) is_blend = XPLMGetDatai(prt) == 2; if (gRenderer) gRenderer(is_shadow ? 0 : is_blend,gRendererRef); else XPMPDefaultPlaneRenderer(is_shadow ? 0 : is_blend); if(!is_shadow) is_blend = 1 - is_blend; return 1; }
LightCore::~LightCore() { gRenderer()->notifyLightRemoved(this); }