d3d11u.h revision 11547654295cadcfde69f6c2361f50a4cd17fc7a
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/**************************************************************************
2e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright 2010 Luca Barbieri
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * a copy of this software and associated documentation files (the
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "Software"), to deal in the Software without restriction, including
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * without limitation the rights to use, copy, modify, merge, publish,
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * distribute, sublicense, and/or sell copies of the Software, and to
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * permit persons to whom the Software is furnished to do so, subject to
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions:
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The above copyright notice and this permission notice (including the
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * next paragraph) shall be included in all copies or substantial
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * portions of the Software.
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project **************************************************************************/
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <vector>
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "d3d11blit.hlsl.ps.h"
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "d3d11blit.hlsl.vs.h"
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename index_type = unsigned>
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct triangle_list_indices : public std::vector<index_type>
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned base;
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bool flip;
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	triangle_list_indices()
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	: base(0), flip(false)
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{}
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void poly(unsigned a, unsigned b, unsigned c)
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		this->push_back(base + a);
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		this->push_back(base + (flip ? c : b));
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		this->push_back(base + (flip ? b : c));
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void poly(unsigned a, unsigned b, unsigned c, unsigned d)
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		poly(a, b, c);
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		poly(a, c, d);
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void poly(unsigned a, unsigned b, unsigned c, unsigned d, unsigned e)
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		poly(a, b, c, d);
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		poly(a, d, e);
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void poly(unsigned a, unsigned b, unsigned c, unsigned d, unsigned e, unsigned f)
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
63e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		poly(a, b, c, d, e);
64e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		poly(a, e, f);
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void poly(unsigned a, unsigned b, unsigned c, unsigned d, unsigned e, unsigned f, unsigned g)
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		poly(a, b, c, d, e, f);
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		poly(a, f, g);
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void poly(unsigned a, unsigned b, unsigned c, unsigned d, unsigned e, unsigned f, unsigned g, unsigned h)
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		poly(a, b, c, d, e, f, g);
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		poly(a, g, h);
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct mesh
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ID3D11InputLayout* layout;
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ID3D11Buffer* buffer;
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	D3D11_PRIMITIVE_TOPOLOGY topology;
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned vertex_size;
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned draw_count;
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DXGI_FORMAT index_format;
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned index_offset;
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mesh(ID3D11Device* dev, D3D11_PRIMITIVE_TOPOLOGY topology,
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		const D3D11_INPUT_ELEMENT_DESC *elements, unsigned num_elements,
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		const void* vs, unsigned vs_size,
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		const void* vertices, unsigned vertex_size, unsigned num_vertices,
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		const void* indices = 0, unsigned index_size = 0, unsigned num_indices = 0)
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		: topology(topology), vertex_size(vertex_size), draw_count(index_size ? num_indices : num_vertices)
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		dev->CreateInputLayout(elements, num_elements, vs, vs_size, &layout);
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(index_size == 2)
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			index_format = DXGI_FORMAT_R16_UINT;
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else if(index_size == 4)
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			index_format = DXGI_FORMAT_R32_UINT;
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			index_format = DXGI_FORMAT_UNKNOWN;
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		this->vertex_size = vertex_size;
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		index_offset = vertex_size * num_vertices;
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 	D3D11_BUFFER_DESC bufferd;
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memset(&bufferd, 0, sizeof(bufferd));
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		bufferd.Usage = D3D11_USAGE_IMMUTABLE;
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		bufferd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(index_format)
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			bufferd.BindFlags |= D3D11_BIND_INDEX_BUFFER;
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		bufferd.ByteWidth = index_offset + index_format * num_indices;
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		char* data = (char*)malloc(bufferd.ByteWidth);
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(data, vertices, vertex_size * num_vertices);
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(data + index_offset, indices, index_size * num_indices);
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		D3D11_SUBRESOURCE_DATA buffersd;
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		buffersd.pSysMem = data;
121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ensure(dev->CreateBuffer(&bufferd, &buffersd, &buffer));
123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		free(data);
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	~mesh()
127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		layout->Release();
129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		buffer->Release();
130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	void bind(ID3D11DeviceContext* ctx)
133221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
134221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		unsigned offset = 0;
135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ctx->IASetPrimitiveTopology(topology);
136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ctx->IASetInputLayout(layout);
137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if(index_format)
138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ctx->IASetIndexBuffer(buffer, index_format, index_offset);
139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ctx->IASetVertexBuffers(0, 1, &buffer, &vertex_size, &offset);
140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	void draw_bound(ID3D11DeviceContext* ctx)
143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if(index_format)
145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ctx->DrawIndexed(draw_count, 0, 0);
146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		else
147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ctx->Draw(draw_count, 0);
148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	void bind_and_draw(ID3D11DeviceContext* ctx)
151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		bind(ctx);
153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		draw_bound(ctx);
154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom};
156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrommesh* create_tex_quad(ID3D11Device* dev, const BYTE* vs, unsigned vs_size)
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	float quad_data[] = {
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		-1, -1, 0, 1,
161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		-1, 1, 0, 0,
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		1, -1, 1, 1,
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		1, 1, 1, 0,
164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	};
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	D3D11_INPUT_ELEMENT_DESC elements[2] =
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{"POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 8, D3D11_INPUT_PER_VERTEX_DATA, 0},
170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	};
171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return new mesh(dev, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP,
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		elements, 2,
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		vs, vs_size,
175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		quad_data, 4 * sizeof(float), 4,
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		0, 0, 0);
177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct d3d11_blitter
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mesh* quad;
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ID3D11VertexShader* vs;
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ID3D11PixelShader* ps;
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ID3D11SamplerState* sampler[2];
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	d3d11_blitter(ID3D11Device* dev)
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		quad = create_tex_quad(dev, g_vs_blit, sizeof(g_vs_blit));
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		dev->CreateVertexShader(g_vs_blit, sizeof(g_vs_blit), 0, &vs);
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		dev->CreatePixelShader(g_ps_blit, sizeof(g_ps_blit), 0, &ps);
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for(unsigned i = 0; i < 2; ++i)
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			D3D11_SAMPLER_DESC samplerd;
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memset(&samplerd, 0, sizeof(samplerd));
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			samplerd.Filter = i ? D3D11_FILTER_MIN_MAG_MIP_LINEAR : D3D11_FILTER_MIN_MAG_MIP_LINEAR;
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			samplerd.AddressU = samplerd.AddressV = samplerd.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			dev->CreateSamplerState(&samplerd, &sampler[i]);
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void bind(ID3D11DeviceContext* ctx, ID3D11ShaderResourceView* srv, ID3D11RenderTargetView* rtv, float x, float y, float width, float height, bool linear)
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		D3D11_VIEWPORT vp;
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		vp.TopLeftX = x;
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		vp.TopLeftY = y;
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		vp.Width = width;
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		vp.Height = height;
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		vp.MinDepth = 0;
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		vp.MaxDepth = 1;
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->RSSetViewports(1, &vp);
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->RSSetState(0);
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->OMSetBlendState(0, 0, ~0);
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->OMSetDepthStencilState(0, 0);
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->OMSetRenderTargets(1, &rtv, 0);
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->VSSetShader(vs, 0, 0);
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->PSSetShader(ps, 0, 0);
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->PSSetShaderResources(0, 1, &srv);
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->PSSetSamplers(0, 1, &sampler[!!linear]);
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		quad->bind(ctx);
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void draw_bound(ID3D11DeviceContext* ctx)
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		quad->draw_bound(ctx);
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void bind_draw_and_unbind(ID3D11DeviceContext* ctx, ID3D11ShaderResourceView* srv, ID3D11RenderTargetView* rtv, float x, float y, float width, float height, bool linear)
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		bind(ctx, srv, rtv, x, y, width, height, linear);
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		draw_bound(ctx);
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		unbind(ctx);
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	void unbind(ID3D11DeviceContext* ctx)
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		void* null = 0;
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->PSSetShaderResources(0, 1, (ID3D11ShaderResourceView**)&null);
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->PSSetSamplers(0, 1, (ID3D11SamplerState**)&null);
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T, unsigned n>
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct vec_t
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T v[n];
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T& operator [](unsigned i)
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return v[i];
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	const T& operator [](unsigned i) const
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return v[i];
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project};
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T, unsigned n>
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvec_t<T, n> operator -(const vec_t<T, n> a)
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	vec_t<T, n> r;
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(unsigned i = 0; i < n; ++i)
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		r[i] = -a[i];
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return r;
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T, unsigned n>
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvec_t<T, n> operator +(const vec_t<T, n>& a, const vec_t<T, n>& b)
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	vec_t<T, n> r;
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(unsigned i = 0; i < n; ++i)
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		r[i] = a[i] + b[i];
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return r;
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T, unsigned n>
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvec_t<T, n>& operator +=(vec_t<T, n>& a, const vec_t<T, n>& b)
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(unsigned i = 0; i < n; ++i)
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		a[i] += b[i];
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return a;
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T, unsigned r, unsigned c>
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstruct mat_t : public vec_t<vec_t<T, r>, c>
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{};
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T, unsigned n>
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvec_t<T, n> operator *(const vec_t<T, n>& a, const T& b)
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	vec_t<T, n> r;
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(unsigned i = 0; i < n; ++i)
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		r[i] = a[i] * b;
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return r;
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T, unsigned n>
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvec_t<T, n> operator *(const T& b, const vec_t<T, n>& a)
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	vec_t<T, n> r;
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(unsigned i = 0; i < n; ++i)
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		r[i] = a[i] * b;
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return r;
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T, unsigned d, unsigned e>
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvec_t<T, e> operator *(const mat_t<T, e, d>& m, const vec_t<T, d>& b)
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	vec_t<T, e> r;
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r = m[0] * b[0];
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(unsigned i = 1; i < d; ++i)
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		r += m[i] * b[i];
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return r;
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T, unsigned d, unsigned e, unsigned f>
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmat_t<T, e, f> operator *(const mat_t<T, e, d>& m, const mat_t<T, d, f>& b)
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mat_t<T, e, f> r;
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for(unsigned i = 0; i < d; ++i)
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		r[i] = m * b[i];
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return r;
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T>
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvec_t<T, 3> vec(T a, T b, T c)
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	vec_t<T, 4> v;
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v[0] = a;
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v[1] = b;
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v[2] = c;
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return v;
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T>
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvec_t<T, 4> vec(T a, T b, T c, T d)
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	vec_t<T, 4> v;
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v[0] = a;
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v[1] = b;
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v[2] = c;
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v[3] = d;
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return v;
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef mat_t<float, 4, 4> float4x4;
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef mat_t<float, 4, 3> float4x3;
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef mat_t<float, 3, 4> float3x4;
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef mat_t<float, 3, 3> float3x3;
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef vec_t<float, 3> float3;
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef vec_t<float, 4> float4;
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T>
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmat_t<T, 4, 4> mat4x4_frustum(T left, T right, T bottom, T top, T nearval, T farval)
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T x = (2.0f * nearval) / (right - left);
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T y = (2.0f * nearval) / (top - bottom);
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T a = (right + left) / (right - left);
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T b = (top + bottom) / (top - bottom);
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T c = -(farval + nearval) / (farval - nearval);
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T d = -(2.0f * farval * nearval) / (farval - nearval);
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T _0 = (T)0;
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mat_t<T, 4, 4> m;
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	m[0] = vec(x, _0, _0, _0);
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	m[1] = vec(_0, y, _0, _0);
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	m[2] = vec(a, b, c, (T)-1);
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	m[3] = vec(_0, _0, d, _0);
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return m;
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T>
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmat_t<T, 3, 3> mat3x3_diag(T v)
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mat_t<T, 3, 3> m;
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T _0 = (T)0;
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	m[0] = vec(v, _0, _0);
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	m[1] = vec(_0, v, _0);
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	m[2] = vec(_0, _0, v);
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return m;
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T>
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmat_t<T, 4, 4> mat4x4_diag(T v)
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mat_t<T, 4, 4> m;
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	T _0 = (T)0;
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	m[0] = vec(v, _0, _0, _0);
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	m[1] = vec(_0, v, _0, _0);
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	m[2] = vec(_0, _0, v, _0);
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	m[3] = vec(_0, _0, _0, v);
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return m;
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T, unsigned n>
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmat_t<T, n, n> mat_push_rotate(const mat_t<T, n, n>& m, unsigned axis, T angle)
40043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom{
40143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	T s = (T)sin(angle);
40243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	T c = (T)cos(angle);
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mat_t<T, n, n> r = m;
40543c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	unsigned a = (axis + 1) % 3;
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned b = (axis + 2) % 3;
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[a] = (m[a] * c) + (m[b] * s);
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	r[b] = -(m[a] * s) + (m[b] * c);
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return r;
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttemplate<typename T, unsigned n>
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectmat_t<T, n, n> mat_push_translate(const mat_t<T, n, n>& m, float x, float y, float z)
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	mat_t<T, n, n> r = m;
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	vec_t<T, n> v;
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	v[0] = x;
41843c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	v[1] = y;
41943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	v[2] = z;
42043c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	if(n >= 4)
42143c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom		v[3] = (T)0;
42243c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom	r[3] += m * v;
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return r;
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project