static void d3d11_wm_destroy( sgui_ctx_wm* super ) { sgui_d3d11_wm* this = (sgui_d3d11_wm*)super; ID3D11SamplerState_Release( this->sampler ); ID3D11ShaderResourceView_Release( this->view ); ID3D11Texture2D_Release( this->skintex ); free( this ); }
void D3D11_DestroyTexture (texid_t tex) { if (!tex) return; if (tex->ptr2) ID3D11ShaderResourceView_Release((ID3D11ShaderResourceView*)tex->ptr2); tex->ptr2 = NULL; if (tex->ptr) ID3D11Texture2D_Release((ID3D11Texture2D*)tex->ptr); tex->ptr = NULL; }
int main(void) { struct nk_context *ctx; struct nk_color background; WNDCLASSW wc; RECT rect = { 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT }; DWORD style = WS_OVERLAPPEDWINDOW; DWORD exstyle = WS_EX_APPWINDOW; HWND wnd; int running = 1; HRESULT hr; D3D_FEATURE_LEVEL feature_level; DXGI_SWAP_CHAIN_DESC swap_chain_desc; /* Win32 */ memset(&wc, 0, sizeof(wc)); wc.lpfnWndProc = WindowProc; wc.hInstance = GetModuleHandleW(0); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.lpszClassName = L"NuklearWindowClass"; RegisterClassW(&wc); AdjustWindowRectEx(&rect, style, FALSE, exstyle); wnd = CreateWindowExW(exstyle, wc.lpszClassName, L"Nuklear Demo", style | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, wc.hInstance, NULL); /* D3D11 setup */ memset(&swap_chain_desc, 0, sizeof(swap_chain_desc)); swap_chain_desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; swap_chain_desc.BufferDesc.RefreshRate.Numerator = 60; swap_chain_desc.BufferDesc.RefreshRate.Denominator = 1; swap_chain_desc.SampleDesc.Count = 1; swap_chain_desc.SampleDesc.Quality = 0; swap_chain_desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swap_chain_desc.BufferCount = 1; swap_chain_desc.OutputWindow = wnd; swap_chain_desc.Windowed = TRUE; swap_chain_desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; swap_chain_desc.Flags = 0; if (FAILED(D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0, NULL, 0, D3D11_SDK_VERSION, &swap_chain_desc, &swap_chain, &device, &feature_level, &context))) { /* if hardware device fails, then try WARP high-performance software rasterizer, this is useful for RDP sessions */ hr = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_WARP, NULL, 0, NULL, 0, D3D11_SDK_VERSION, &swap_chain_desc, &swap_chain, &device, &feature_level, &context); assert(SUCCEEDED(hr)); } set_swap_chain_size(WINDOW_WIDTH, WINDOW_HEIGHT); /* GUI */ ctx = nk_d3d11_init(device, WINDOW_WIDTH, WINDOW_HEIGHT, MAX_VERTEX_BUFFER, MAX_INDEX_BUFFER); /* Load Fonts: if none of these are loaded a default font will be used */ {struct nk_font_atlas *atlas; nk_d3d11_font_stash_begin(&atlas); /*struct nk_font *droid = nk_font_atlas_add_from_file(atlas, "../../../extra_font/DroidSans.ttf", 14, 0);*/ /*struct nk_font *robot = nk_font_atlas_add_from_file(atlas, "../../../extra_font/Robot-Regular.ttf", 14, 0);*/ /*struct nk_font *future = nk_font_atlas_add_from_file(atlas, "../../../extra_font/kenvector_future_thin.ttf", 13, 0);*/ /*struct nk_font *clean = nk_font_atlas_add_from_file(atlas, "../../../extra_font/ProggyClean.ttf", 12, 0);*/ /*struct nk_font *tiny = nk_font_atlas_add_from_file(atlas, "../../../extra_font/ProggyTiny.ttf", 10, 0);*/ /*struct nk_font *cousine = nk_font_atlas_add_from_file(atlas, "../../../extra_font/Cousine-Regular.ttf", 13, 0);*/ nk_d3d11_font_stash_end(); /*nk_style_set_font(ctx, &droid->handle)*/;} /* style.c */ /*set_style(ctx, THEME_WHITE);*/ /*set_style(ctx, THEME_RED);*/ /*set_style(ctx, THEME_BLUE);*/ /*set_style(ctx, THEME_DARK);*/ background = nk_rgb(28,48,62); while (running) { /* Input */ MSG msg; nk_input_begin(ctx); while (PeekMessageW(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) running = 0; TranslateMessage(&msg); DispatchMessageW(&msg); } nk_input_end(ctx); /* GUI */ {struct nk_panel layout; if (nk_begin(ctx, &layout, "Demo", nk_rect(50, 50, 230, 250), NK_WINDOW_BORDER|NK_WINDOW_MOVABLE|NK_WINDOW_SCALABLE| NK_WINDOW_MINIMIZABLE|NK_WINDOW_TITLE)) { enum {EASY, HARD}; static int op = EASY; static int property = 20; nk_layout_row_static(ctx, 30, 80, 1); if (nk_button_label(ctx, "button", NK_BUTTON_DEFAULT)) fprintf(stdout, "button pressed\n"); nk_layout_row_dynamic(ctx, 30, 2); if (nk_option_label(ctx, "easy", op == EASY)) op = EASY; if (nk_option_label(ctx, "hard", op == HARD)) op = HARD; nk_layout_row_dynamic(ctx, 22, 1); nk_property_int(ctx, "Compression:", 0, &property, 100, 10, 1); {struct nk_panel combo; nk_layout_row_dynamic(ctx, 20, 1); nk_label(ctx, "background:", NK_TEXT_LEFT); nk_layout_row_dynamic(ctx, 25, 1); if (nk_combo_begin_color(ctx, &combo, background, 400)) { nk_layout_row_dynamic(ctx, 120, 1); background = nk_color_picker(ctx, background, NK_RGBA); nk_layout_row_dynamic(ctx, 25, 1); background.r = (nk_byte)nk_propertyi(ctx, "#R:", 0, background.r, 255, 1,1); background.g = (nk_byte)nk_propertyi(ctx, "#G:", 0, background.g, 255, 1,1); background.b = (nk_byte)nk_propertyi(ctx, "#B:", 0, background.b, 255, 1,1); background.a = (nk_byte)nk_propertyi(ctx, "#A:", 0, background.a, 255, 1,1); nk_combo_end(ctx); }} } nk_end(ctx);} if (nk_window_is_closed(ctx, "Demo")) break; /* -------------- EXAMPLES ---------------- */ /*calculator(ctx);*/ /*overview(ctx);*/ /*node_editor(ctx);*/ /* ----------------------------------------- */ {/* Draw */ float bg[4]; nk_color_fv(bg, background); ID3D11DeviceContext_ClearRenderTargetView(context, rt_view, bg); ID3D11DeviceContext_OMSetRenderTargets(context, 1, &rt_view, NULL); nk_d3d11_render(context, NK_ANTI_ALIASING_ON); hr = IDXGISwapChain_Present(swap_chain, 1, 0); if (hr == DXGI_ERROR_DEVICE_RESET || hr == DXGI_ERROR_DEVICE_REMOVED) { /* to recover from this, you'll need to recreate device and all the resources */ MessageBoxW(NULL, L"D3D11 device is lost or removed!", L"Error", 0); break; } else if (hr == DXGI_STATUS_OCCLUDED) { /* window is not visible, so vsync won't work. Let's sleep a bit to reduce CPU usage */ Sleep(10); } assert(SUCCEEDED(hr));} } ID3D11DeviceContext_ClearState(context); nk_d3d11_shutdown(); ID3D11ShaderResourceView_Release(rt_view); ID3D11DeviceContext_Release(context); ID3D11Device_Release(device); IDXGISwapChain_Release(swap_chain); UnregisterClassW(wc.lpszClassName, wc.hInstance); return 0; }
sgui_ctx_wm* d3d11_wm_create( sgui_window* wnd ) { D3D11_SHADER_RESOURCE_VIEW_DESC rvdesc; D3D11_SAMPLER_DESC sampdesc; D3D11_SUBRESOURCE_DATA data; unsigned int width, height; D3D11_TEXTURE2D_DESC desc; sgui_d3d11_context* ctx; sgui_subwm_skin* skin; sgui_d3d11_wm* this; sgui_ctx_wm* super; HRESULT status; ctx = (sgui_d3d11_context*)sgui_window_get_context( wnd ); if( !ctx ) return NULL; this = calloc( 1, sizeof(sgui_d3d11_wm) ); super = (sgui_ctx_wm*)this; if( !this ) return NULL; memset( &desc, 0, sizeof(desc) ); memset( &data, 0, sizeof(data) ); memset( &rvdesc, 0, sizeof(rvdesc) ); memset( &sampdesc, 0, sizeof(sampdesc) ); skin = sgui_subwm_skin_get( ); skin->get_ctx_skin_texture_size( skin, &width, &height ); desc.Width = width; desc.Height = height; desc.MipLevels = 1; desc.ArraySize = 1; desc.SampleDesc.Count = 1; desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; desc.Usage = D3D11_USAGE_IMMUTABLE; desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; data.pSysMem = skin->get_ctx_skin_texture( skin ); data.SysMemPitch = width*4; rvdesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; rvdesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; rvdesc.Texture2D.MipLevels = 1; sampdesc.Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT; sampdesc.ComparisonFunc = D3D11_COMPARISON_NEVER; sampdesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; sampdesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; sampdesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; status = ID3D11Device_CreateTexture2D( ctx->dev, &desc, &data, &this->skintex ); if( status!=S_OK || !this->skintex ) goto fail; status = ID3D11Device_CreateShaderResourceView( ctx->dev, (void*)this->skintex, &rvdesc, &this->view ); if( status!=S_OK || !this->view ) goto failtex; status = ID3D11Device_CreateSamplerState( ctx->dev, &sampdesc, &this->sampler ); if( status!=S_OK || !this->sampler ) goto failview; /* init */ super->wnd = wnd; super->draw_gui = d3d11_wm_draw_gui; super->destroy = d3d11_wm_destroy; return super; failview: ID3D11ShaderResourceView_Release( this->view ); failtex: ID3D11Texture2D_Release( this->skintex ); fail: free( this ); return NULL; }