111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri/**************************************************************************
211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri *
311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * Copyright 2010 Luca Barbieri
411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri *
511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * Permission is hereby granted, free of charge, to any person obtaining
611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * a copy of this software and associated documentation files (the
711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * "Software"), to deal in the Software without restriction, including
811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * without limitation the rights to use, copy, modify, merge, publish,
911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * distribute, sublicense, and/or sell copies of the Software, and to
1011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * permit persons to whom the Software is furnished to do so, subject to
1111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * the following conditions:
1211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri *
1311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * The above copyright notice and this permission notice (including the
1411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * next paragraph) shall be included in all copies or substantial
1511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * portions of the Software.
1611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri *
1711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
2011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
2111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
2211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
2311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri *
2511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri **************************************************************************/
2611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
2711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri#define _USE_MATH_DEFINES
2811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri#include "d3d11app.h"
2911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri#include "d3d11spikysphere.hlsl.vs.h"
3011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri#include "d3d11spikysphere.hlsl.hs.h"
3111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri#include "d3d11spikysphere.hlsl.ds.h"
3211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri#include "d3d11spikysphere.hlsl.ps.h"
3311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
3411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri#include <stdlib.h>
3511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri#include <stdio.h>
3611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri#include <math.h>
3711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri#include <float.h>
3811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri#include <D3DX10math.h>
3911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
4011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieristruct cb_frame_t
4111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri{
4211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	D3DXMATRIX model;
4311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	D3DXMATRIX view_proj;
4411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	float disp_scale;
4511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	float disp_freq;
4611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	float tess_factor;
4711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri};
4811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
4911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieristatic float vertex_data[] =
5011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri{
5111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	1.0, 0.0, 0.0,
5211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, 1.0, 0.0,
5311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, 0.0, 1.0,
5411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
5511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, 1.0, 0.0,
5611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	-1.0, 0.0, 0.0,
5711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, 0.0, 1.0,
5811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
5911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, -1.0, 0.0,
6011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	1.0, 0.0, 0.0,
6111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, 0.0, 1.0,
6211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
6311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	-1.0, 0.0, 0.0,
6411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, -1.0, 0.0,
6511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, 0.0, 1.0,
6611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
6711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, 1.0, 0.0,
6811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	1.0, 0.0, 0.0,
6911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, 0.0, -1.0,
7011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
7111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	-1.0, 0.0, 0.0,
7211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, 1.0, 0.0,
7311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, 0.0, -1.0,
7411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
7511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	1.0, 0.0, 0.0,
7611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, -1.0, 0.0,
7711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, 0.0, -1.0,
7811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
7911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, -1.0, 0.0,
8011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	-1.0, 0.0, 0.0,
8111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	0.0, 0.0, -1.0,
8211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri};
8311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
8411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieristruct d3d11spikysphere : public d3d11_application
8511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri{
8611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	ID3D11Device* dev;
8711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	ID3D11PixelShader* ps;
8811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	ID3D11DomainShader* ds;
8911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	ID3D11HullShader* hs;
9011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	ID3D11VertexShader* vs;
9111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	ID3D11InputLayout* layout;
9211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	ID3D11Buffer* vb;
9311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	ID3D11RenderTargetView* rtv;
9411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	ID3D11DepthStencilView* zsv;
9511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	ID3D11Buffer* cb_frame;
9611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
9711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	int cur_width;
9811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	int cur_height;
9911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
10011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	d3d11spikysphere()
10111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	: cur_width(-1), cur_height(-1), zsv(0)
10211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	{}
10311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
10411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	bool init(ID3D11Device* dev, int argc, char** argv)
10511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	{
10611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		this->dev = dev;
10711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ensure(dev->CreateVertexShader(g_vs, sizeof(g_vs), NULL, &vs));
10811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ensure(dev->CreateHullShader(g_hs, sizeof(g_hs), NULL, &hs));
10911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ensure(dev->CreateDomainShader(g_ds, sizeof(g_ds), NULL, &ds));
11011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ensure(dev->CreatePixelShader(g_ps, sizeof(g_ps), NULL, &ps));
11111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
11211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3D11_INPUT_ELEMENT_DESC elements[1] =
11311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		{
11411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,
11511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			0, D3D11_INPUT_PER_VERTEX_DATA, 0},
11611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		};
11711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
11811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ensure(dev->CreateInputLayout(elements, 1, g_vs, sizeof(g_vs), &layout));
11911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
12011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3D11_BUFFER_DESC bufferd;
12111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		bufferd.ByteWidth = sizeof(vertex_data);
12211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		bufferd.Usage = D3D11_USAGE_IMMUTABLE;
12311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		bufferd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
12411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		bufferd.CPUAccessFlags = 0;
12511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		bufferd.MiscFlags = 0;
12611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		bufferd.StructureByteStride = 0;
12711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
12811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3D11_SUBRESOURCE_DATA buffersd;
12911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		buffersd.pSysMem = vertex_data;
13011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
13111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ensure(dev->CreateBuffer(&bufferd, &buffersd, &vb));
13211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
13311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3D11_BUFFER_DESC cbd;
13411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		cbd.ByteWidth = (sizeof(cb_frame_t) + 15) & ~15;
13511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		cbd.Usage = D3D11_USAGE_DYNAMIC;
13611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		cbd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
13711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		cbd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
13811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		cbd.MiscFlags = 0;
13911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		cbd.StructureByteStride = 0;
14011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
14111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ensure(dev->CreateBuffer(&cbd, NULL, &cb_frame));
14211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		return true;
14311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	}
14411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
14511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	void draw(ID3D11DeviceContext* ctx, ID3D11RenderTargetView* rtv, unsigned width, unsigned height, double time)
14611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	{
14711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3D11_VIEWPORT vp;
14811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		memset(&vp, 0, sizeof(vp));
14911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		vp.Width = (float)width;
15011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		vp.Height = (float)height;
15111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		vp.MaxDepth = 1.0f;
15211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
15311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		if(width != cur_width || height != cur_height)
15411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		{
15511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			if(zsv)
15611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri				zsv->Release();
15711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			ID3D11Texture2D* zsbuf;
15811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			D3D11_TEXTURE2D_DESC zsbufd;
15911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			memset(&zsbufd, 0, sizeof(zsbufd));
16011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			zsbufd.Width = width;
16111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			zsbufd.Height = height;
16211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			zsbufd.Format = DXGI_FORMAT_D32_FLOAT;
16311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			zsbufd.ArraySize = 1;
16411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			zsbufd.MipLevels = 1;
16511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			zsbufd.SampleDesc.Count = 1;
16611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			zsbufd.BindFlags = D3D11_BIND_DEPTH_STENCIL;
16711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			ensure(dev->CreateTexture2D(&zsbufd, 0, &zsbuf));
16811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			ensure(dev->CreateDepthStencilView(zsbuf, 0, &zsv));
16911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri			zsbuf->Release();
17011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		}
17111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
17211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		float black[4] = {0, 0, 0, 0};
17311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
17411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3D11_MAPPED_SUBRESOURCE map;
17511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ensure(ctx->Map(cb_frame, 0, D3D11_MAP_WRITE_DISCARD, 0, &map));
17611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		cb_frame_t* cb_frame_data = (cb_frame_t*)map.pData;
17711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3DXMatrixIdentity(&cb_frame_data->model);
17811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
17911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3DXMATRIX view;
18011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3DXVECTOR3 eye(2.0f * (float)sin(time), 0.0f, 2.0f * (float)cos(time));
18111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3DXVECTOR3 at(0, 0, 0);
18211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3DXVECTOR3 up(0, 1, 0);
18311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3DXMatrixLookAtLH(&view, &eye, &at, &up);
18411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3DXMATRIX proj;
18511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		D3DXMatrixPerspectiveLH(&proj, 1.1f, 1.1f, 1.0f, 3.0f);
18611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
18711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		cb_frame_data->view_proj = view * proj;
18811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		float min_tess_factor = 1.0f;
18911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		cb_frame_data->tess_factor = (1.0f - (float)cos(time)) * ((64.0f - min_tess_factor) / 2.0f) + min_tess_factor;
19011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		cb_frame_data->disp_scale = 0.9f;
19111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		//cb_frame_data->disp_scale = (sin(time) + 1.0) / 2.0;
19211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		cb_frame_data->disp_freq = 5.0f * (float)M_PI;
19311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		//cb_frame_data->disp_freq = (4.0 + 4.0 * cos(time / 5.0)) * PI;
19411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->Unmap(cb_frame, 0);
19511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
19611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->HSSetConstantBuffers(0, 1, &cb_frame);
19711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->DSSetConstantBuffers(0, 1, &cb_frame);
19811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
19911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		//ctx->OMSetBlendState(bs, black, ~0);
20011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		//ctx->OMSetDepthStencilState(dss, 0);
20111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->OMSetRenderTargets(1, &rtv, zsv);
20211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		//ctx->RSSetState(rs);
20311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->RSSetViewports(1, &vp);
20411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
20511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST);
20611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->IASetInputLayout(layout);
20711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		unsigned stride = 3 * 4;
20811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		unsigned offset = 0;
20911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->IASetVertexBuffers(0, 1, &vb, &stride, &offset);
21011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
21111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->VSSetShader(vs, NULL, 0);
21211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->HSSetShader(hs, NULL, 0);
21311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->DSSetShader(ds, NULL, 0);
21411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->GSSetShader(NULL, NULL, 0);
21511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->PSSetShader(ps, NULL, 0);
21611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
21711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->ClearRenderTargetView(rtv, black);
21811547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->ClearDepthStencilView(zsv, D3D11_CLEAR_DEPTH, 1.0f, 0);
21911547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
22011547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri		ctx->Draw(3 * 8, 0);
22111547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	}
22211547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri};
22311547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri
22411547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbierid3d11_application* d3d11_application_create()
22511547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri{
22611547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri	return new d3d11spikysphere();
22711547654295cadcfde69f6c2361f50a4cd17fc7aLuca Barbieri}
228