mirror of
https://github.com/borgesdan/xn65
synced 2024-12-29 21:54:47 +01:00
Correções em Effect
This commit is contained in:
parent
d7583015a2
commit
2fc10f79e1
@ -27,6 +27,22 @@ namespace xna {
|
|||||||
throw std::runtime_error("Effect::Effect: Unable to create an effect with memory data.");
|
throw std::runtime_error("Effect::Effect: Unable to create an effect with memory data.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PEffectTechnique Effect::CurrentTechnique() const {
|
||||||
|
D3DX11_EFFECT_DESC desc;
|
||||||
|
impl->dxEffect->GetDesc(&desc);
|
||||||
|
|
||||||
|
auto tech = impl->dxEffect->GetTechniqueByIndex(0);
|
||||||
|
|
||||||
|
auto technique = snew<EffectTechnique>();
|
||||||
|
technique->impl->dxContext = m_device->impl->_context;
|
||||||
|
technique->impl->dxContext->AddRef();
|
||||||
|
|
||||||
|
tech->Release();
|
||||||
|
tech = nullptr;
|
||||||
|
|
||||||
|
return technique;
|
||||||
|
}
|
||||||
|
|
||||||
EffectAnnotation::EffectAnnotation() {
|
EffectAnnotation::EffectAnnotation() {
|
||||||
impl = unew<PlatformImplementation>();
|
impl = unew<PlatformImplementation>();
|
||||||
}
|
}
|
||||||
@ -36,6 +52,9 @@ namespace xna {
|
|||||||
D3DX11_EFFECT_TYPE_DESC desc{};
|
D3DX11_EFFECT_TYPE_DESC desc{};
|
||||||
type->GetDesc(&desc);
|
type->GetDesc(&desc);
|
||||||
|
|
||||||
|
type->Release();
|
||||||
|
type = nullptr;
|
||||||
|
|
||||||
return static_cast<Int>(desc.Columns);
|
return static_cast<Int>(desc.Columns);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,6 +63,9 @@ namespace xna {
|
|||||||
D3DX11_EFFECT_TYPE_DESC desc{};
|
D3DX11_EFFECT_TYPE_DESC desc{};
|
||||||
type->GetDesc(&desc);
|
type->GetDesc(&desc);
|
||||||
|
|
||||||
|
type->Release();
|
||||||
|
type = nullptr;
|
||||||
|
|
||||||
return String(desc.TypeName);
|
return String(desc.TypeName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -52,6 +74,9 @@ namespace xna {
|
|||||||
D3DX11_EFFECT_TYPE_DESC desc{};
|
D3DX11_EFFECT_TYPE_DESC desc{};
|
||||||
type->GetDesc(&desc);
|
type->GetDesc(&desc);
|
||||||
|
|
||||||
|
type->Release();
|
||||||
|
type = nullptr;
|
||||||
|
|
||||||
switch (desc.Class)
|
switch (desc.Class)
|
||||||
{
|
{
|
||||||
case D3D_SHADER_VARIABLE_CLASS::D3D_SVC_MATRIX_COLUMNS:
|
case D3D_SHADER_VARIABLE_CLASS::D3D_SVC_MATRIX_COLUMNS:
|
||||||
@ -75,17 +100,23 @@ namespace xna {
|
|||||||
D3DX11_EFFECT_TYPE_DESC desc{};
|
D3DX11_EFFECT_TYPE_DESC desc{};
|
||||||
type->GetDesc(&desc);
|
type->GetDesc(&desc);
|
||||||
|
|
||||||
|
type->Release();
|
||||||
|
type = nullptr;
|
||||||
|
|
||||||
return static_cast<Int>(desc.Rows);
|
return static_cast<Int>(desc.Rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
String EffectAnnotation::Semantic() const {
|
String EffectAnnotation::Semantic() const {
|
||||||
auto type = impl->dxVariable->GetType();
|
auto type = impl->dxVariable->GetType();
|
||||||
auto semantic = type->GetMemberSemantic(0);
|
auto semantic = type->GetMemberSemantic(0);
|
||||||
|
|
||||||
|
type->Release();
|
||||||
|
type = nullptr;
|
||||||
|
|
||||||
return std::string(semantic);
|
return std::string(semantic);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EffectAnnotation::GetValueBoolean() const {
|
bool EffectAnnotation::GetValueBoolean() const {
|
||||||
auto type = impl->dxVariable->GetType();
|
|
||||||
auto scalar = impl->dxVariable->AsScalar();
|
auto scalar = impl->dxVariable->AsScalar();
|
||||||
|
|
||||||
bool value = false;
|
bool value = false;
|
||||||
@ -94,31 +125,35 @@ namespace xna {
|
|||||||
if FAILED(hr)
|
if FAILED(hr)
|
||||||
throw std::runtime_error("EffectAnnotation::GetValueBoolean: Unable to get boolean value.");
|
throw std::runtime_error("EffectAnnotation::GetValueBoolean: Unable to get boolean value.");
|
||||||
|
|
||||||
|
scalar->Release();
|
||||||
|
scalar = nullptr;
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
Int EffectAnnotation::GetValueInt32() const {
|
Int EffectAnnotation::GetValueInt32() const {
|
||||||
auto type = impl->dxVariable->GetType();
|
|
||||||
auto scalar = impl->dxVariable->AsScalar();
|
auto scalar = impl->dxVariable->AsScalar();
|
||||||
|
|
||||||
int value = 0;
|
int value = 0;
|
||||||
auto hr = scalar->GetInt(&value);
|
auto hr = scalar->GetInt(&value);
|
||||||
|
|
||||||
if FAILED(hr)
|
if FAILED(hr)
|
||||||
throw std::runtime_error("EffectAnnotation::GetValueBoolean: Unable to get interger value.");
|
throw std::runtime_error("EffectAnnotation::GetValueInt32: Unable to get interger value.");
|
||||||
|
|
||||||
|
scalar->Release();
|
||||||
|
scalar = nullptr;
|
||||||
|
|
||||||
return static_cast<Int>(value);
|
return static_cast<Int>(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
Matrix EffectAnnotation::GetValueMatrix() const {
|
Matrix EffectAnnotation::GetValueMatrix() const {
|
||||||
auto type = impl->dxVariable->GetType();
|
|
||||||
auto matrix = impl->dxVariable->AsMatrix();
|
auto matrix = impl->dxVariable->AsMatrix();
|
||||||
|
|
||||||
float values[16];
|
float values[16];
|
||||||
auto hr = matrix->GetMatrix(values);
|
auto hr = matrix->GetMatrix(values);
|
||||||
|
|
||||||
if FAILED(hr)
|
if FAILED(hr)
|
||||||
throw std::runtime_error("EffectAnnotation::GetValueBoolean: Unable to get matrix value.");
|
throw std::runtime_error("EffectAnnotation::GetValueMatrix: Unable to get matrix value.");
|
||||||
|
|
||||||
Matrix m;
|
Matrix m;
|
||||||
m.M11 = values[0];
|
m.M11 = values[0];
|
||||||
@ -138,70 +173,86 @@ namespace xna {
|
|||||||
m.M43 = values[14];
|
m.M43 = values[14];
|
||||||
m.M44 = values[15];
|
m.M44 = values[15];
|
||||||
|
|
||||||
|
matrix->Release();
|
||||||
|
matrix = nullptr;
|
||||||
|
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
float EffectAnnotation::GetValueSingle() const {
|
float EffectAnnotation::GetValueSingle() const {
|
||||||
auto type = impl->dxVariable->GetType();
|
|
||||||
auto scalar = impl->dxVariable->AsScalar();
|
auto scalar = impl->dxVariable->AsScalar();
|
||||||
|
|
||||||
float value = 0;
|
float value = 0;
|
||||||
auto hr = scalar->GetFloat(&value);
|
auto hr = scalar->GetFloat(&value);
|
||||||
|
|
||||||
if FAILED(hr)
|
if FAILED(hr)
|
||||||
throw std::runtime_error("EffectAnnotation::GetValueBoolean: Unable to get float value.");
|
throw std::runtime_error("EffectAnnotation::GetValueSingle: Unable to get float value.");
|
||||||
|
|
||||||
|
scalar->Release();
|
||||||
|
scalar = nullptr;
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
String EffectAnnotation::GetValueString() const {
|
String EffectAnnotation::GetValueString() const {
|
||||||
return {};
|
auto str = impl->dxVariable->AsString();
|
||||||
|
|
||||||
|
LPCSTR data;
|
||||||
|
str->GetString(&data);
|
||||||
|
|
||||||
|
str->Release();
|
||||||
|
str = nullptr;
|
||||||
|
|
||||||
|
return String(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector2 EffectAnnotation::GetValueVector2() const {
|
Vector2 EffectAnnotation::GetValueVector2() const {
|
||||||
auto type = impl->dxVariable->GetType();
|
|
||||||
auto scalar = impl->dxVariable->AsScalar();
|
auto scalar = impl->dxVariable->AsScalar();
|
||||||
|
|
||||||
float values[2];
|
float values[2];
|
||||||
auto hr = scalar->GetFloatArray(values, 0, 2);
|
auto hr = scalar->GetFloatArray(values, 0, 2);
|
||||||
|
|
||||||
if FAILED(hr)
|
if FAILED(hr)
|
||||||
throw std::runtime_error("EffectAnnotation::GetValueBoolean: Unable to get Vector2 value.");
|
throw std::runtime_error("EffectAnnotation::GetValueVector2: Unable to get Vector2 value.");
|
||||||
|
|
||||||
Vector2 v;
|
Vector2 v;
|
||||||
v.X = values[0];
|
v.X = values[0];
|
||||||
v.Y = values[1];
|
v.Y = values[1];
|
||||||
|
|
||||||
|
scalar->Release();
|
||||||
|
scalar = nullptr;
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector3 EffectAnnotation::GetValueVector3() const {
|
Vector3 EffectAnnotation::GetValueVector3() const {
|
||||||
auto type = impl->dxVariable->GetType();
|
|
||||||
auto scalar = impl->dxVariable->AsScalar();
|
auto scalar = impl->dxVariable->AsScalar();
|
||||||
|
|
||||||
float values[3];
|
float values[3];
|
||||||
auto hr = scalar->GetFloatArray(values, 0, 3);
|
auto hr = scalar->GetFloatArray(values, 0, 3);
|
||||||
|
|
||||||
if FAILED(hr)
|
if FAILED(hr)
|
||||||
throw std::runtime_error("EffectAnnotation::GetValueBoolean: Unable to get Vector3 value.");
|
throw std::runtime_error("EffectAnnotation::GetValueVector3: Unable to get Vector3 value.");
|
||||||
|
|
||||||
Vector3 v;
|
Vector3 v;
|
||||||
v.X = values[0];
|
v.X = values[0];
|
||||||
v.Y = values[1];
|
v.Y = values[1];
|
||||||
v.Z = values[2];
|
v.Z = values[2];
|
||||||
|
|
||||||
|
scalar->Release();
|
||||||
|
scalar = nullptr;
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
Vector4 EffectAnnotation::GetValueVector4() const {
|
Vector4 EffectAnnotation::GetValueVector4() const {
|
||||||
auto type = impl->dxVariable->GetType();
|
|
||||||
auto scalar = impl->dxVariable->AsScalar();
|
auto scalar = impl->dxVariable->AsScalar();
|
||||||
|
|
||||||
float values[4];
|
float values[4];
|
||||||
auto hr = scalar->GetFloatArray(values, 0, 4);
|
auto hr = scalar->GetFloatArray(values, 0, 4);
|
||||||
|
|
||||||
if FAILED(hr)
|
if FAILED(hr)
|
||||||
throw std::runtime_error("EffectAnnotation::GetValueBoolean: Unable to get Vector4 value.");
|
throw std::runtime_error("EffectAnnotation::GetValueVector4: Unable to get Vector4 value.");
|
||||||
|
|
||||||
Vector4 v;
|
Vector4 v;
|
||||||
v.X = values[0];
|
v.X = values[0];
|
||||||
@ -209,15 +260,14 @@ namespace xna {
|
|||||||
v.Z = values[2];
|
v.Z = values[2];
|
||||||
v.W = values[3];
|
v.W = values[3];
|
||||||
|
|
||||||
|
scalar->Release();
|
||||||
|
scalar = nullptr;
|
||||||
|
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
EffectPass::EffectPass(PGraphicsDevice const& device) {
|
EffectPass::EffectPass() {
|
||||||
if (!device || !device->impl || !device->impl->_context)
|
|
||||||
throw std::invalid_argument("EffectPass::EffectPass: device is null");
|
|
||||||
|
|
||||||
impl = unew<PlatformImplementation>();
|
impl = unew<PlatformImplementation>();
|
||||||
impl->graphicsDevice = device;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String EffectPass::Name() const {
|
String EffectPass::Name() const {
|
||||||
@ -248,6 +298,10 @@ namespace xna {
|
|||||||
auto current = impl->dxPass->GetAnnotationByIndex(i);
|
auto current = impl->dxPass->GetAnnotationByIndex(i);
|
||||||
auto annotation = snew<EffectAnnotation>();
|
auto annotation = snew<EffectAnnotation>();
|
||||||
annotation->impl->dxVariable = current;
|
annotation->impl->dxVariable = current;
|
||||||
|
annotation->impl->dxVariable->AddRef();
|
||||||
|
|
||||||
|
current->Release();
|
||||||
|
current = nullptr;
|
||||||
|
|
||||||
list[i] = annotation;
|
list[i] = annotation;
|
||||||
}
|
}
|
||||||
@ -260,12 +314,11 @@ namespace xna {
|
|||||||
if (!impl->dxPass)
|
if (!impl->dxPass)
|
||||||
throw std::runtime_error("EffectPass::Apply: The class was not initialized correctly");
|
throw std::runtime_error("EffectPass::Apply: The class was not initialized correctly");
|
||||||
|
|
||||||
impl->dxPass->Apply(0, impl->graphicsDevice->impl->_context);
|
impl->dxPass->Apply(0, impl->dxContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
EffectTechnique::EffectTechnique(sptr<GraphicsDevice> const& device) {
|
EffectTechnique::EffectTechnique() {
|
||||||
impl = unew<PlatformImplementation>();
|
impl = unew<PlatformImplementation>();
|
||||||
impl->graphicsDevice = device;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
String EffectTechnique::Name() const {
|
String EffectTechnique::Name() const {
|
||||||
@ -290,6 +343,10 @@ namespace xna {
|
|||||||
auto current = impl->dxTechnique->GetAnnotationByIndex(i);
|
auto current = impl->dxTechnique->GetAnnotationByIndex(i);
|
||||||
auto annotation = snew<EffectAnnotation>();
|
auto annotation = snew<EffectAnnotation>();
|
||||||
annotation->impl->dxVariable = current;
|
annotation->impl->dxVariable = current;
|
||||||
|
annotation->impl->dxVariable->AddRef();
|
||||||
|
|
||||||
|
current->Release();
|
||||||
|
current = nullptr;
|
||||||
|
|
||||||
list[i] = annotation;
|
list[i] = annotation;
|
||||||
}
|
}
|
||||||
@ -311,8 +368,16 @@ namespace xna {
|
|||||||
|
|
||||||
for (size_t i = 0; i < passCount; ++i) {
|
for (size_t i = 0; i < passCount; ++i) {
|
||||||
auto current = impl->dxTechnique->GetPassByIndex(i);
|
auto current = impl->dxTechnique->GetPassByIndex(i);
|
||||||
auto pass = snew<EffectPass>(impl->graphicsDevice);
|
|
||||||
|
auto pass = snew<EffectPass>();
|
||||||
pass->impl->dxPass = current;
|
pass->impl->dxPass = current;
|
||||||
|
pass->impl->dxPass->AddRef();
|
||||||
|
|
||||||
|
current->Release();
|
||||||
|
current = nullptr;
|
||||||
|
|
||||||
|
pass->impl->dxContext = impl->dxContext;
|
||||||
|
pass->impl->dxContext->AddRef();
|
||||||
|
|
||||||
list[i] = pass;
|
list[i] = pass;
|
||||||
}
|
}
|
||||||
|
@ -83,15 +83,7 @@ namespace xna {
|
|||||||
uptr<PlatformImplementation> impl;
|
uptr<PlatformImplementation> impl;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
EffectPass(sptr<GraphicsDevice> const& device);
|
EffectPass();
|
||||||
};
|
|
||||||
|
|
||||||
class Effect : public GraphicsResource {
|
|
||||||
Effect(sptr<GraphicsDevice> const& device, std::vector<Byte> const& effectCode);
|
|
||||||
|
|
||||||
public:
|
|
||||||
struct PlatformImplementation;
|
|
||||||
uptr<PlatformImplementation> impl;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
using PEffectPass = sptr<EffectPass>;
|
using PEffectPass = sptr<EffectPass>;
|
||||||
@ -143,7 +135,19 @@ namespace xna {
|
|||||||
uptr<PlatformImplementation> impl;
|
uptr<PlatformImplementation> impl;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
EffectTechnique(sptr<GraphicsDevice> const& device);
|
EffectTechnique();
|
||||||
|
};
|
||||||
|
|
||||||
|
using PEffectTechnique = sptr<EffectTechnique>;
|
||||||
|
|
||||||
|
class Effect : public GraphicsResource {
|
||||||
|
Effect(sptr<GraphicsDevice> const& device, std::vector<Byte> const& effectCode);
|
||||||
|
|
||||||
|
PEffectTechnique CurrentTechnique() const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
struct PlatformImplementation;
|
||||||
|
uptr<PlatformImplementation> impl;
|
||||||
};
|
};
|
||||||
|
|
||||||
class IEffectMatrices {
|
class IEffectMatrices {
|
||||||
|
@ -966,7 +966,7 @@ namespace xna {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ID3DX11EffectPass* dxPass = nullptr;
|
ID3DX11EffectPass* dxPass = nullptr;
|
||||||
PGraphicsDevice graphicsDevice = nullptr;
|
ID3D11DeviceContext* dxContext = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct EffectTechnique::PlatformImplementation {
|
struct EffectTechnique::PlatformImplementation {
|
||||||
@ -978,7 +978,7 @@ namespace xna {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ID3DX11EffectTechnique* dxTechnique = nullptr;
|
ID3DX11EffectTechnique* dxTechnique = nullptr;
|
||||||
PGraphicsDevice graphicsDevice = nullptr;
|
ID3D11DeviceContext* dxContext = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user