void Link::createPhysicsObject(void) { if (theWorldPtr == nullptr) return; assert(theFirstPtr != nullptr); assert(theFirstLocalPosPtr != nullptr); if (theFirstPtr == nullptr) { DEBUG4("Link: No valid first object found..."); return; } b2Body *myFirstB2BodyPtr = getB2BodyPtrFor(theFirstPtr, theFirstLocalPosPtr->toPosition()); assert (myFirstB2BodyPtr); theFirstPtr->addJoint(std::dynamic_pointer_cast<JointInterface>(getThisPtr())); assert(theSecondPtr != nullptr); assert(theSecondLocalPosPtr != nullptr); if (theSecondPtr == nullptr) { DEBUG4("Link: No valid second object found..."); return; } b2Body *mySecondB2BodyPtr = getB2BodyPtrFor(theSecondPtr, theSecondLocalPosPtr->toPosition()); assert (mySecondB2BodyPtr); theSecondPtr->addJoint(std::dynamic_pointer_cast<JointInterface>(getThisPtr())); // *** initialise Box2D's distance joint: // note: Initialize() uses a global coordinate... b2DistanceJointDef myJointDef; myJointDef.Initialize(myFirstB2BodyPtr, mySecondB2BodyPtr, (theFirstPtr->getOrigCenter() + *theFirstLocalPosPtr).toB2Vec2(), (theSecondPtr->getOrigCenter() + *theSecondLocalPosPtr).toB2Vec2()); myJointDef.userData = this; theJointPtr = (b2DistanceJoint *) getB2WorldPtr()->CreateJoint(&myJointDef); }
void ColaSplatter::reportNormalImpulseLength(qreal, AbstractObject *) { // oww we hit something. // that's the end for us // - just allow for some time to transfer the impact if (!hasRequestedRemoval) { theWorldPtr->removeMe(getThisPtr(), 0.1); hasRequestedRemoval = true; } }
void D3D11TextureCore::create3DTex() { UINT32 width = mProperties.getWidth(); UINT32 height = mProperties.getHeight(); UINT32 depth = mProperties.getDepth(); int usage = mProperties.getUsage(); UINT32 numMips = mProperties.getNumMipmaps(); PixelFormat format = mProperties.getFormat(); bool hwGamma = mProperties.isHardwareGammaEnabled(); PixelFormat closestFormat = D3D11Mappings::getClosestSupportedPF(format, hwGamma); // TODO - Consider making this a parameter eventually bool readableDepth = true; // We must have those defined here assert(width > 0 && height > 0 && depth > 0); // Determine which D3D11 pixel format we'll use HRESULT hr; DXGI_FORMAT d3dPF = D3D11Mappings::getPF(closestFormat, hwGamma); if (format != D3D11Mappings::getPF(d3dPF)) { BS_EXCEPT(RenderingAPIException, "Provided pixel format is not supported by the driver: " + toString(format)); } mDXGIColorFormat = d3dPF; mDXGIDepthStencilFormat = d3dPF; D3D11_TEXTURE3D_DESC desc; desc.Width = static_cast<UINT32>(width); desc.Height = static_cast<UINT32>(height); desc.Depth = static_cast<UINT32>(depth); desc.Format = d3dPF; desc.MiscFlags = 0; if ((mProperties.getUsage() & TU_RENDERTARGET) != 0) { desc.Usage = D3D11_USAGE_DEFAULT; desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; desc.CPUAccessFlags = 0; desc.MipLevels = 1; } else if ((mProperties.getUsage() & TU_DEPTHSTENCIL) != 0) { desc.Usage = D3D11_USAGE_DEFAULT; desc.CPUAccessFlags = 0; desc.MipLevels = 1; if (readableDepth) desc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; else desc.BindFlags = D3D11_BIND_DEPTH_STENCIL; mDXGIColorFormat = D3D11Mappings::getShaderResourceDepthStencilPF(closestFormat); mDXGIDepthStencilFormat = d3dPF; } else { desc.Usage = D3D11Mappings::getUsage((GpuBufferUsage)usage); desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; desc.CPUAccessFlags = D3D11Mappings::getAccessFlags((GpuBufferUsage)usage); // Determine total number of mipmaps including main one (d3d11 convention) desc.MipLevels = (numMips == MIP_UNLIMITED || (1U << numMips) > std::max(std::max(width, height), depth)) ? 0 : numMips + 1; } if ((usage & TU_LOADSTORE) != 0) desc.BindFlags |= D3D11_BIND_UNORDERED_ACCESS; // Create the texture D3D11RenderAPI* rs = static_cast<D3D11RenderAPI*>(RenderAPICore::instancePtr()); D3D11Device& device = rs->getPrimaryDevice(); hr = device.getD3D11Device()->CreateTexture3D(&desc, nullptr, &m3DTex); // Check result and except if failed if (FAILED(hr) || device.hasError()) { String errorDescription = device.getErrorDescription(); BS_EXCEPT(RenderingAPIException, "Error creating texture\nError Description:" + errorDescription); } hr = m3DTex->QueryInterface(__uuidof(ID3D11Resource), (void **)&mTex); if(FAILED(hr) || device.hasError()) { String errorDescription = device.getErrorDescription(); BS_EXCEPT(RenderingAPIException, "Can't get base texture\nError Description:" + errorDescription); } // Create texture view m3DTex->GetDesc(&desc); if (mProperties.getNumMipmaps() != (desc.MipLevels - 1)) { BS_EXCEPT(RenderingAPIException, "Driver returned different number of mip maps than requested. " \ "Requested: " + toString(mProperties.getNumMipmaps()) + ". Got: " + toString(desc.MipLevels - 1) + "."); } mDXGIFormat = desc.Format; if ((usage & TU_DEPTHSTENCIL) == 0 || readableDepth) { TEXTURE_VIEW_DESC viewDesc; viewDesc.mostDetailMip = 0; viewDesc.numMips = desc.MipLevels; viewDesc.firstArraySlice = 0; viewDesc.numArraySlices = 1; viewDesc.usage = GVU_DEFAULT; SPtr<TextureCore> thisPtr = std::static_pointer_cast<TextureCore>(getThisPtr()); mShaderResourceView = bs_shared_ptr<D3D11TextureView>(new (bs_alloc<D3D11TextureView>()) D3D11TextureView(thisPtr, viewDesc)); } }
void D3D11TextureCore::create2DTex() { UINT32 width = mProperties.getWidth(); UINT32 height = mProperties.getHeight(); int usage = mProperties.getUsage(); UINT32 numMips = mProperties.getNumMipmaps(); PixelFormat format = mProperties.getFormat(); bool hwGamma = mProperties.isHardwareGammaEnabled(); UINT32 sampleCount = mProperties.getMultisampleCount(); TextureType texType = mProperties.getTextureType(); PixelFormat closestFormat = D3D11Mappings::getClosestSupportedPF(format, hwGamma); UINT32 numFaces = mProperties.getNumFaces(); // TODO - Consider making this a parameter eventually bool readableDepth = true; // We must have those defined here assert(width > 0 || height > 0); // Determine which D3D11 pixel format we'll use HRESULT hr; DXGI_FORMAT d3dPF = D3D11Mappings::getPF(closestFormat, hwGamma); if (format != D3D11Mappings::getPF(d3dPF)) { BS_EXCEPT(RenderingAPIException, "Provided pixel format is not supported by the driver: " + toString(format)); } mDXGIColorFormat = d3dPF; mDXGIDepthStencilFormat = d3dPF; D3D11_TEXTURE2D_DESC desc; desc.Width = static_cast<UINT32>(width); desc.Height = static_cast<UINT32>(height); desc.ArraySize = numFaces == 0 ? 1 : numFaces;; desc.Format = d3dPF; desc.MiscFlags = 0; if((usage & TU_RENDERTARGET) != 0) { desc.Usage = D3D11_USAGE_DEFAULT; desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; // TODO - Add flags to allow RT be created without shader resource flags (might be more optimal) desc.CPUAccessFlags = 0; desc.MipLevels = 1; DXGI_SAMPLE_DESC sampleDesc; D3D11RenderAPI* rs = static_cast<D3D11RenderAPI*>(RenderAPICore::instancePtr()); rs->determineMultisampleSettings(sampleCount, d3dPF, &sampleDesc); desc.SampleDesc = sampleDesc; if (texType == TEX_TYPE_CUBE_MAP) { BS_EXCEPT(NotImplementedException, "Cube map not yet supported as a render target."); // TODO: Will be once I add proper texture array support } } else if((usage & TU_DEPTHSTENCIL) != 0) { desc.Usage = D3D11_USAGE_DEFAULT; desc.CPUAccessFlags = 0; desc.MipLevels = 1; desc.Format = D3D11Mappings::getTypelessDepthStencilPF(closestFormat); if(readableDepth) desc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; else desc.BindFlags = D3D11_BIND_DEPTH_STENCIL; DXGI_SAMPLE_DESC sampleDesc; D3D11RenderAPI* rs = static_cast<D3D11RenderAPI*>(RenderAPICore::instancePtr()); rs->determineMultisampleSettings(sampleCount, d3dPF, &sampleDesc); desc.SampleDesc = sampleDesc; if (texType == TEX_TYPE_CUBE_MAP) { BS_EXCEPT(NotImplementedException, "Cube map not yet supported as a depth stencil target."); // TODO: Will be once I add proper texture array support } mDXGIColorFormat = D3D11Mappings::getShaderResourceDepthStencilPF(closestFormat); mDXGIDepthStencilFormat = d3dPF; } else { desc.Usage = D3D11Mappings::getUsage((GpuBufferUsage)usage); desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; desc.CPUAccessFlags = D3D11Mappings::getAccessFlags((GpuBufferUsage)usage); // Determine total number of mipmaps including main one (d3d11 convention) desc.MipLevels = (numMips == MIP_UNLIMITED || (1U << numMips) > width) ? 0 : numMips + 1; DXGI_SAMPLE_DESC sampleDesc; sampleDesc.Count = 1; sampleDesc.Quality = 0; desc.SampleDesc = sampleDesc; } if (texType == TEX_TYPE_CUBE_MAP) desc.MiscFlags |= D3D11_RESOURCE_MISC_TEXTURECUBE; if ((usage & TU_LOADSTORE) != 0) desc.BindFlags |= D3D11_BIND_UNORDERED_ACCESS; // Create the texture D3D11RenderAPI* rs = static_cast<D3D11RenderAPI*>(RenderAPICore::instancePtr()); D3D11Device& device = rs->getPrimaryDevice(); hr = device.getD3D11Device()->CreateTexture2D(&desc, nullptr, &m2DTex); // Check result and except if failed if (FAILED(hr) || device.hasError()) { String errorDescription = device.getErrorDescription(); BS_EXCEPT(RenderingAPIException, "Error creating texture\nError Description:" + errorDescription); } hr = m2DTex->QueryInterface(__uuidof(ID3D11Resource), (void **)&mTex); if(FAILED(hr) || device.hasError()) { String errorDescription = device.getErrorDescription(); BS_EXCEPT(RenderingAPIException, "Can't get base texture\nError Description:" + errorDescription); } m2DTex->GetDesc(&desc); if(numMips != (desc.MipLevels - 1)) { BS_EXCEPT(RenderingAPIException, "Driver returned different number of mip maps than requested. " \ "Requested: " + toString(numMips) + ". Got: " + toString(desc.MipLevels - 1) + "."); } mDXGIFormat = desc.Format; // Create shader texture view if((usage & TU_DEPTHSTENCIL) == 0 || readableDepth) { TEXTURE_VIEW_DESC viewDesc; viewDesc.mostDetailMip = 0; viewDesc.numMips = desc.MipLevels; viewDesc.firstArraySlice = 0; viewDesc.numArraySlices = desc.ArraySize; viewDesc.usage = GVU_DEFAULT; SPtr<TextureCore> thisPtr = std::static_pointer_cast<TextureCore>(getThisPtr()); mShaderResourceView = bs_shared_ptr<D3D11TextureView>(new (bs_alloc<D3D11TextureView>()) D3D11TextureView(thisPtr, viewDesc)); } }