/*** Autogenerated by WIDL 9.5 from include/d3d10effect.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __d3d10effect_h__
#define __d3d10effect_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef __ID3D10EffectType_FWD_DEFINED__
#define __ID3D10EffectType_FWD_DEFINED__
typedef interface ID3D10EffectType ID3D10EffectType;
#ifdef __cplusplus
interface ID3D10EffectType;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectVariable_FWD_DEFINED__
#define __ID3D10EffectVariable_FWD_DEFINED__
typedef interface ID3D10EffectVariable ID3D10EffectVariable;
#ifdef __cplusplus
interface ID3D10EffectVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectConstantBuffer_FWD_DEFINED__
#define __ID3D10EffectConstantBuffer_FWD_DEFINED__
typedef interface ID3D10EffectConstantBuffer ID3D10EffectConstantBuffer;
#ifdef __cplusplus
interface ID3D10EffectConstantBuffer;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectScalarVariable_FWD_DEFINED__
#define __ID3D10EffectScalarVariable_FWD_DEFINED__
typedef interface ID3D10EffectScalarVariable ID3D10EffectScalarVariable;
#ifdef __cplusplus
interface ID3D10EffectScalarVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectVectorVariable_FWD_DEFINED__
#define __ID3D10EffectVectorVariable_FWD_DEFINED__
typedef interface ID3D10EffectVectorVariable ID3D10EffectVectorVariable;
#ifdef __cplusplus
interface ID3D10EffectVectorVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectMatrixVariable_FWD_DEFINED__
#define __ID3D10EffectMatrixVariable_FWD_DEFINED__
typedef interface ID3D10EffectMatrixVariable ID3D10EffectMatrixVariable;
#ifdef __cplusplus
interface ID3D10EffectMatrixVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectStringVariable_FWD_DEFINED__
#define __ID3D10EffectStringVariable_FWD_DEFINED__
typedef interface ID3D10EffectStringVariable ID3D10EffectStringVariable;
#ifdef __cplusplus
interface ID3D10EffectStringVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectShaderResourceVariable_FWD_DEFINED__
#define __ID3D10EffectShaderResourceVariable_FWD_DEFINED__
typedef interface ID3D10EffectShaderResourceVariable ID3D10EffectShaderResourceVariable;
#ifdef __cplusplus
interface ID3D10EffectShaderResourceVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectRenderTargetViewVariable_FWD_DEFINED__
#define __ID3D10EffectRenderTargetViewVariable_FWD_DEFINED__
typedef interface ID3D10EffectRenderTargetViewVariable ID3D10EffectRenderTargetViewVariable;
#ifdef __cplusplus
interface ID3D10EffectRenderTargetViewVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectDepthStencilViewVariable_FWD_DEFINED__
#define __ID3D10EffectDepthStencilViewVariable_FWD_DEFINED__
typedef interface ID3D10EffectDepthStencilViewVariable ID3D10EffectDepthStencilViewVariable;
#ifdef __cplusplus
interface ID3D10EffectDepthStencilViewVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectShaderVariable_FWD_DEFINED__
#define __ID3D10EffectShaderVariable_FWD_DEFINED__
typedef interface ID3D10EffectShaderVariable ID3D10EffectShaderVariable;
#ifdef __cplusplus
interface ID3D10EffectShaderVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectBlendVariable_FWD_DEFINED__
#define __ID3D10EffectBlendVariable_FWD_DEFINED__
typedef interface ID3D10EffectBlendVariable ID3D10EffectBlendVariable;
#ifdef __cplusplus
interface ID3D10EffectBlendVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectDepthStencilVariable_FWD_DEFINED__
#define __ID3D10EffectDepthStencilVariable_FWD_DEFINED__
typedef interface ID3D10EffectDepthStencilVariable ID3D10EffectDepthStencilVariable;
#ifdef __cplusplus
interface ID3D10EffectDepthStencilVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectRasterizerVariable_FWD_DEFINED__
#define __ID3D10EffectRasterizerVariable_FWD_DEFINED__
typedef interface ID3D10EffectRasterizerVariable ID3D10EffectRasterizerVariable;
#ifdef __cplusplus
interface ID3D10EffectRasterizerVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectSamplerVariable_FWD_DEFINED__
#define __ID3D10EffectSamplerVariable_FWD_DEFINED__
typedef interface ID3D10EffectSamplerVariable ID3D10EffectSamplerVariable;
#ifdef __cplusplus
interface ID3D10EffectSamplerVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectTechnique_FWD_DEFINED__
#define __ID3D10EffectTechnique_FWD_DEFINED__
typedef interface ID3D10EffectTechnique ID3D10EffectTechnique;
#ifdef __cplusplus
interface ID3D10EffectTechnique;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10Effect_FWD_DEFINED__
#define __ID3D10Effect_FWD_DEFINED__
typedef interface ID3D10Effect ID3D10Effect;
#ifdef __cplusplus
interface ID3D10Effect;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectPool_FWD_DEFINED__
#define __ID3D10EffectPool_FWD_DEFINED__
typedef interface ID3D10EffectPool ID3D10EffectPool;
#ifdef __cplusplus
interface ID3D10EffectPool;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectPass_FWD_DEFINED__
#define __ID3D10EffectPass_FWD_DEFINED__
typedef interface ID3D10EffectPass ID3D10EffectPass;
#ifdef __cplusplus
interface ID3D10EffectPass;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10StateBlock_FWD_DEFINED__
#define __ID3D10StateBlock_FWD_DEFINED__
typedef interface ID3D10StateBlock ID3D10StateBlock;
#ifdef __cplusplus
interface ID3D10StateBlock;
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <d3d10.h>
#include <d3d10shader.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __ID3D10EffectConstantBuffer_FWD_DEFINED__
#define __ID3D10EffectConstantBuffer_FWD_DEFINED__
typedef interface ID3D10EffectConstantBuffer ID3D10EffectConstantBuffer;
#ifdef __cplusplus
interface ID3D10EffectConstantBuffer;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectBlendVariable_FWD_DEFINED__
#define __ID3D10EffectBlendVariable_FWD_DEFINED__
typedef interface ID3D10EffectBlendVariable ID3D10EffectBlendVariable;
#ifdef __cplusplus
interface ID3D10EffectBlendVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectDepthStencilVariable_FWD_DEFINED__
#define __ID3D10EffectDepthStencilVariable_FWD_DEFINED__
typedef interface ID3D10EffectDepthStencilVariable ID3D10EffectDepthStencilVariable;
#ifdef __cplusplus
interface ID3D10EffectDepthStencilVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectDepthStencilViewVariable_FWD_DEFINED__
#define __ID3D10EffectDepthStencilViewVariable_FWD_DEFINED__
typedef interface ID3D10EffectDepthStencilViewVariable ID3D10EffectDepthStencilViewVariable;
#ifdef __cplusplus
interface ID3D10EffectDepthStencilViewVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectMatrixVariable_FWD_DEFINED__
#define __ID3D10EffectMatrixVariable_FWD_DEFINED__
typedef interface ID3D10EffectMatrixVariable ID3D10EffectMatrixVariable;
#ifdef __cplusplus
interface ID3D10EffectMatrixVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectPass_FWD_DEFINED__
#define __ID3D10EffectPass_FWD_DEFINED__
typedef interface ID3D10EffectPass ID3D10EffectPass;
#ifdef __cplusplus
interface ID3D10EffectPass;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectRasterizerVariable_FWD_DEFINED__
#define __ID3D10EffectRasterizerVariable_FWD_DEFINED__
typedef interface ID3D10EffectRasterizerVariable ID3D10EffectRasterizerVariable;
#ifdef __cplusplus
interface ID3D10EffectRasterizerVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectRenderTargetViewVariable_FWD_DEFINED__
#define __ID3D10EffectRenderTargetViewVariable_FWD_DEFINED__
typedef interface ID3D10EffectRenderTargetViewVariable ID3D10EffectRenderTargetViewVariable;
#ifdef __cplusplus
interface ID3D10EffectRenderTargetViewVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectSamplerVariable_FWD_DEFINED__
#define __ID3D10EffectSamplerVariable_FWD_DEFINED__
typedef interface ID3D10EffectSamplerVariable ID3D10EffectSamplerVariable;
#ifdef __cplusplus
interface ID3D10EffectSamplerVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectScalarVariable_FWD_DEFINED__
#define __ID3D10EffectScalarVariable_FWD_DEFINED__
typedef interface ID3D10EffectScalarVariable ID3D10EffectScalarVariable;
#ifdef __cplusplus
interface ID3D10EffectScalarVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectShaderVariable_FWD_DEFINED__
#define __ID3D10EffectShaderVariable_FWD_DEFINED__
typedef interface ID3D10EffectShaderVariable ID3D10EffectShaderVariable;
#ifdef __cplusplus
interface ID3D10EffectShaderVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectShaderResourceVariable_FWD_DEFINED__
#define __ID3D10EffectShaderResourceVariable_FWD_DEFINED__
typedef interface ID3D10EffectShaderResourceVariable ID3D10EffectShaderResourceVariable;
#ifdef __cplusplus
interface ID3D10EffectShaderResourceVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectStringVariable_FWD_DEFINED__
#define __ID3D10EffectStringVariable_FWD_DEFINED__
typedef interface ID3D10EffectStringVariable ID3D10EffectStringVariable;
#ifdef __cplusplus
interface ID3D10EffectStringVariable;
#endif /* __cplusplus */
#endif

#ifndef __ID3D10EffectVectorVariable_FWD_DEFINED__
#define __ID3D10EffectVectorVariable_FWD_DEFINED__
typedef interface ID3D10EffectVectorVariable ID3D10EffectVectorVariable;
#ifdef __cplusplus
interface ID3D10EffectVectorVariable;
#endif /* __cplusplus */
#endif

#ifndef D3D10_BYTES_FROM_BITS
#define D3D10_BYTES_FROM_BITS(x) (((x) + 7) >> 3)
#endif
#define D3D10_EFFECT_VARIABLE_POOLED (0x1)

#define D3D10_EFFECT_VARIABLE_ANNOTATION (0x2)

#define D3D10_EFFECT_VARIABLE_EXPLICIT_BIND_POINT (0x4)

typedef enum _D3D10_DEVICE_STATE_TYPES {
    D3D10_DST_SO_BUFFERS = 1,
    D3D10_DST_OM_RENDER_TARGETS = 2,
    D3D10_DST_OM_DEPTH_STENCIL_STATE = 3,
    D3D10_DST_OM_BLEND_STATE = 4,
    D3D10_DST_VS = 5,
    D3D10_DST_VS_SAMPLERS = 6,
    D3D10_DST_VS_SHADER_RESOURCES = 7,
    D3D10_DST_VS_CONSTANT_BUFFERS = 8,
    D3D10_DST_GS = 9,
    D3D10_DST_GS_SAMPLERS = 10,
    D3D10_DST_GS_SHADER_RESOURCES = 11,
    D3D10_DST_GS_CONSTANT_BUFFERS = 12,
    D3D10_DST_PS = 13,
    D3D10_DST_PS_SAMPLERS = 14,
    D3D10_DST_PS_SHADER_RESOURCES = 15,
    D3D10_DST_PS_CONSTANT_BUFFERS = 16,
    D3D10_DST_IA_VERTEX_BUFFERS = 17,
    D3D10_DST_IA_INDEX_BUFFER = 18,
    D3D10_DST_IA_INPUT_LAYOUT = 19,
    D3D10_DST_IA_PRIMITIVE_TOPOLOGY = 20,
    D3D10_DST_RS_VIEWPORTS = 21,
    D3D10_DST_RS_SCISSOR_RECTS = 22,
    D3D10_DST_RS_RASTERIZER_STATE = 23,
    D3D10_DST_PREDICATION = 24
} D3D10_DEVICE_STATE_TYPES;
typedef struct _D3D10_EFFECT_TYPE_DESC {
    const char *TypeName;
    D3D10_SHADER_VARIABLE_CLASS Class;
    D3D10_SHADER_VARIABLE_TYPE Type;
    UINT Elements;
    UINT Members;
    UINT Rows;
    UINT Columns;
    UINT PackedSize;
    UINT UnpackedSize;
    UINT Stride;
} D3D10_EFFECT_TYPE_DESC;
typedef struct _D3D10_EFFECT_VARIABLE_DESC {
    const char *Name;
    const char *Semantic;
    UINT Flags;
    UINT Annotations;
    UINT BufferOffset;
    UINT ExplicitBindPoint;
} D3D10_EFFECT_VARIABLE_DESC;
typedef struct _D3D10_TECHNIQUE_DESC {
    const char *Name;
    UINT Passes;
    UINT Annotations;
} D3D10_TECHNIQUE_DESC;
typedef struct _D3D10_STATE_BLOCK_MASK {
    BYTE VS;
    BYTE VSSamplers[2];
    BYTE VSShaderResources[16];
    BYTE VSConstantBuffers[2];
    BYTE GS;
    BYTE GSSamplers[2];
    BYTE GSShaderResources[16];
    BYTE GSConstantBuffers[2];
    BYTE PS;
    BYTE PSSamplers[2];
    BYTE PSShaderResources[16];
    BYTE PSConstantBuffers[2];
    BYTE IAVertexBuffers[2];
    BYTE IAIndexBuffer;
    BYTE IAInputLayout;
    BYTE IAPrimitiveTopology;
    BYTE OMRenderTargets;
    BYTE OMDepthStencilState;
    BYTE OMBlendState;
    BYTE RSViewports;
    BYTE RSScissorRects;
    BYTE RSRasterizerState;
    BYTE SOBuffers;
    BYTE Predication;
} D3D10_STATE_BLOCK_MASK;
typedef struct _D3D10_EFFECT_DESC {
    WINBOOL IsChildEffect;
    UINT ConstantBuffers;
    UINT SharedConstantBuffers;
    UINT GlobalVariables;
    UINT SharedGlobalVariables;
    UINT Techniques;
} D3D10_EFFECT_DESC;
typedef struct _D3D10_EFFECT_SHADER_DESC {
    const BYTE *pInputSignature;
    WINBOOL IsInline;
    const BYTE *pBytecode;
    UINT BytecodeLength;
    const char *SODecl;
    UINT NumInputSignatureEntries;
    UINT NumOutputSignatureEntries;
} D3D10_EFFECT_SHADER_DESC;
typedef struct _D3D10_PASS_DESC {
    const char *Name;
    UINT Annotations;
    BYTE *pIAInputSignature;
    SIZE_T IAInputSignatureSize;
    UINT StencilRef;
    UINT SampleMask;
    FLOAT BlendFactor[4];
} D3D10_PASS_DESC;
typedef struct _D3D10_PASS_SHADER_DESC {
    ID3D10EffectShaderVariable *pShaderVariable;
    UINT ShaderIndex;
} D3D10_PASS_SHADER_DESC;
#define D3D10_EFFECT_COMPILE_CHILD_EFFECT (0x1)

#define D3D10_EFFECT_COMPILE_ALLOW_SLOW_OPS (0x2)

#define D3D10_EFFECT_SINGLE_THREADED (0x8)

/*****************************************************************************
 * ID3D10EffectType interface
 */
#ifndef __ID3D10EffectType_INTERFACE_DEFINED__
#define __ID3D10EffectType_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectType, 0x4e9e1ddc, 0xcd9d, 0x4772, 0xa8,0x37, 0x00,0x18,0x0b,0x9b,0x88,0xfd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4e9e1ddc-cd9d-4772-a837-00180b9b88fd")
ID3D10EffectType
{

    BEGIN_INTERFACE

    virtual WINBOOL STDMETHODCALLTYPE IsValid(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDesc(
        D3D10_EFFECT_TYPE_DESC *desc) = 0;

    virtual ID3D10EffectType * STDMETHODCALLTYPE GetMemberTypeByIndex(
        UINT index) = 0;

    virtual ID3D10EffectType * STDMETHODCALLTYPE GetMemberTypeByName(
        const char *name) = 0;

    virtual ID3D10EffectType * STDMETHODCALLTYPE GetMemberTypeBySemantic(
        const char *semantic) = 0;

    virtual const char * STDMETHODCALLTYPE GetMemberName(
        UINT index) = 0;

    virtual const char * STDMETHODCALLTYPE GetMemberSemantic(
        UINT index) = 0;

    END_INTERFACE

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectType, 0x4e9e1ddc, 0xcd9d, 0x4772, 0xa8,0x37, 0x00,0x18,0x0b,0x9b,0x88,0xfd)
#endif
#else
typedef struct ID3D10EffectTypeVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectType methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectType *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectType *This,
        D3D10_EFFECT_TYPE_DESC *desc);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetMemberTypeByIndex)(
        ID3D10EffectType *This,
        UINT index);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetMemberTypeByName)(
        ID3D10EffectType *This,
        const char *name);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetMemberTypeBySemantic)(
        ID3D10EffectType *This,
        const char *semantic);

    const char * (STDMETHODCALLTYPE *GetMemberName)(
        ID3D10EffectType *This,
        UINT index);

    const char * (STDMETHODCALLTYPE *GetMemberSemantic)(
        ID3D10EffectType *This,
        UINT index);

    END_INTERFACE
} ID3D10EffectTypeVtbl;

interface ID3D10EffectType {
    CONST_VTBL ID3D10EffectTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectType methods ***/
#define ID3D10EffectType_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectType_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectType_GetMemberTypeByIndex(This,index) (This)->lpVtbl->GetMemberTypeByIndex(This,index)
#define ID3D10EffectType_GetMemberTypeByName(This,name) (This)->lpVtbl->GetMemberTypeByName(This,name)
#define ID3D10EffectType_GetMemberTypeBySemantic(This,semantic) (This)->lpVtbl->GetMemberTypeBySemantic(This,semantic)
#define ID3D10EffectType_GetMemberName(This,index) (This)->lpVtbl->GetMemberName(This,index)
#define ID3D10EffectType_GetMemberSemantic(This,index) (This)->lpVtbl->GetMemberSemantic(This,index)
#else
/*** ID3D10EffectType methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectType_IsValid(ID3D10EffectType* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectType_GetDesc(ID3D10EffectType* This,D3D10_EFFECT_TYPE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectType_GetMemberTypeByIndex(ID3D10EffectType* This,UINT index) {
    return This->lpVtbl->GetMemberTypeByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectType_GetMemberTypeByName(ID3D10EffectType* This,const char *name) {
    return This->lpVtbl->GetMemberTypeByName(This,name);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectType_GetMemberTypeBySemantic(ID3D10EffectType* This,const char *semantic) {
    return This->lpVtbl->GetMemberTypeBySemantic(This,semantic);
}
static __WIDL_INLINE const char * ID3D10EffectType_GetMemberName(ID3D10EffectType* This,UINT index) {
    return This->lpVtbl->GetMemberName(This,index);
}
static __WIDL_INLINE const char * ID3D10EffectType_GetMemberSemantic(ID3D10EffectType* This,UINT index) {
    return This->lpVtbl->GetMemberSemantic(This,index);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectType_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectVariable interface
 */
#ifndef __ID3D10EffectVariable_INTERFACE_DEFINED__
#define __ID3D10EffectVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectVariable, 0xae897105, 0x00e6, 0x45bf, 0xbb,0x8e, 0x28,0x1d,0xd6,0xdb,0x8e,0x1b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ae897105-00e6-45bf-bb8e-281dd6db8e1b")
ID3D10EffectVariable
{

    BEGIN_INTERFACE

    virtual WINBOOL STDMETHODCALLTYPE IsValid(
        ) = 0;

    virtual ID3D10EffectType * STDMETHODCALLTYPE GetType(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDesc(
        D3D10_EFFECT_VARIABLE_DESC *desc) = 0;

    virtual ID3D10EffectVariable * STDMETHODCALLTYPE GetAnnotationByIndex(
        UINT index) = 0;

    virtual ID3D10EffectVariable * STDMETHODCALLTYPE GetAnnotationByName(
        const char *name) = 0;

    virtual ID3D10EffectVariable * STDMETHODCALLTYPE GetMemberByIndex(
        UINT index) = 0;

    virtual ID3D10EffectVariable * STDMETHODCALLTYPE GetMemberByName(
        const char *name) = 0;

    virtual ID3D10EffectVariable * STDMETHODCALLTYPE GetMemberBySemantic(
        const char *semantic) = 0;

    virtual ID3D10EffectVariable * STDMETHODCALLTYPE GetElement(
        UINT index) = 0;

    virtual ID3D10EffectConstantBuffer * STDMETHODCALLTYPE GetParentConstantBuffer(
        ) = 0;

    virtual ID3D10EffectScalarVariable * STDMETHODCALLTYPE AsScalar(
        ) = 0;

    virtual ID3D10EffectVectorVariable * STDMETHODCALLTYPE AsVector(
        ) = 0;

    virtual ID3D10EffectMatrixVariable * STDMETHODCALLTYPE AsMatrix(
        ) = 0;

    virtual ID3D10EffectStringVariable * STDMETHODCALLTYPE AsString(
        ) = 0;

    virtual ID3D10EffectShaderResourceVariable * STDMETHODCALLTYPE AsShaderResource(
        ) = 0;

    virtual ID3D10EffectRenderTargetViewVariable * STDMETHODCALLTYPE AsRenderTargetView(
        ) = 0;

    virtual ID3D10EffectDepthStencilViewVariable * STDMETHODCALLTYPE AsDepthStencilView(
        ) = 0;

    virtual ID3D10EffectConstantBuffer * STDMETHODCALLTYPE AsConstantBuffer(
        ) = 0;

    virtual ID3D10EffectShaderVariable * STDMETHODCALLTYPE AsShader(
        ) = 0;

    virtual ID3D10EffectBlendVariable * STDMETHODCALLTYPE AsBlend(
        ) = 0;

    virtual ID3D10EffectDepthStencilVariable * STDMETHODCALLTYPE AsDepthStencil(
        ) = 0;

    virtual ID3D10EffectRasterizerVariable * STDMETHODCALLTYPE AsRasterizer(
        ) = 0;

    virtual ID3D10EffectSamplerVariable * STDMETHODCALLTYPE AsSampler(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRawValue(
        void *data,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRawValue(
        void *data,
        UINT offset,
        UINT count) = 0;

    END_INTERFACE

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectVariable, 0xae897105, 0x00e6, 0x45bf, 0xbb,0x8e, 0x28,0x1d,0xd6,0xdb,0x8e,0x1b)
#endif
#else
typedef struct ID3D10EffectVariableVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectVariable methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectVariable *This);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetType)(
        ID3D10EffectVariable *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectVariable *This,
        D3D10_EFFECT_VARIABLE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByIndex)(
        ID3D10EffectVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByName)(
        ID3D10EffectVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberBySemantic)(
        ID3D10EffectVariable *This,
        const char *semantic);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetElement)(
        ID3D10EffectVariable *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetParentConstantBuffer)(
        ID3D10EffectVariable *This);

    ID3D10EffectScalarVariable * (STDMETHODCALLTYPE *AsScalar)(
        ID3D10EffectVariable *This);

    ID3D10EffectVectorVariable * (STDMETHODCALLTYPE *AsVector)(
        ID3D10EffectVariable *This);

    ID3D10EffectMatrixVariable * (STDMETHODCALLTYPE *AsMatrix)(
        ID3D10EffectVariable *This);

    ID3D10EffectStringVariable * (STDMETHODCALLTYPE *AsString)(
        ID3D10EffectVariable *This);

    ID3D10EffectShaderResourceVariable * (STDMETHODCALLTYPE *AsShaderResource)(
        ID3D10EffectVariable *This);

    ID3D10EffectRenderTargetViewVariable * (STDMETHODCALLTYPE *AsRenderTargetView)(
        ID3D10EffectVariable *This);

    ID3D10EffectDepthStencilViewVariable * (STDMETHODCALLTYPE *AsDepthStencilView)(
        ID3D10EffectVariable *This);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *AsConstantBuffer)(
        ID3D10EffectVariable *This);

    ID3D10EffectShaderVariable * (STDMETHODCALLTYPE *AsShader)(
        ID3D10EffectVariable *This);

    ID3D10EffectBlendVariable * (STDMETHODCALLTYPE *AsBlend)(
        ID3D10EffectVariable *This);

    ID3D10EffectDepthStencilVariable * (STDMETHODCALLTYPE *AsDepthStencil)(
        ID3D10EffectVariable *This);

    ID3D10EffectRasterizerVariable * (STDMETHODCALLTYPE *AsRasterizer)(
        ID3D10EffectVariable *This);

    ID3D10EffectSamplerVariable * (STDMETHODCALLTYPE *AsSampler)(
        ID3D10EffectVariable *This);

    HRESULT (STDMETHODCALLTYPE *SetRawValue)(
        ID3D10EffectVariable *This,
        void *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRawValue)(
        ID3D10EffectVariable *This,
        void *data,
        UINT offset,
        UINT count);

    END_INTERFACE
} ID3D10EffectVariableVtbl;

interface ID3D10EffectVariable {
    CONST_VTBL ID3D10EffectVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectVariable methods ***/
#define ID3D10EffectVariable_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectVariable_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D10EffectVariable_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectVariable_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectVariable_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectVariable_GetMemberByIndex(This,index) (This)->lpVtbl->GetMemberByIndex(This,index)
#define ID3D10EffectVariable_GetMemberByName(This,name) (This)->lpVtbl->GetMemberByName(This,name)
#define ID3D10EffectVariable_GetMemberBySemantic(This,semantic) (This)->lpVtbl->GetMemberBySemantic(This,semantic)
#define ID3D10EffectVariable_GetElement(This,index) (This)->lpVtbl->GetElement(This,index)
#define ID3D10EffectVariable_GetParentConstantBuffer(This) (This)->lpVtbl->GetParentConstantBuffer(This)
#define ID3D10EffectVariable_AsScalar(This) (This)->lpVtbl->AsScalar(This)
#define ID3D10EffectVariable_AsVector(This) (This)->lpVtbl->AsVector(This)
#define ID3D10EffectVariable_AsMatrix(This) (This)->lpVtbl->AsMatrix(This)
#define ID3D10EffectVariable_AsString(This) (This)->lpVtbl->AsString(This)
#define ID3D10EffectVariable_AsShaderResource(This) (This)->lpVtbl->AsShaderResource(This)
#define ID3D10EffectVariable_AsRenderTargetView(This) (This)->lpVtbl->AsRenderTargetView(This)
#define ID3D10EffectVariable_AsDepthStencilView(This) (This)->lpVtbl->AsDepthStencilView(This)
#define ID3D10EffectVariable_AsConstantBuffer(This) (This)->lpVtbl->AsConstantBuffer(This)
#define ID3D10EffectVariable_AsShader(This) (This)->lpVtbl->AsShader(This)
#define ID3D10EffectVariable_AsBlend(This) (This)->lpVtbl->AsBlend(This)
#define ID3D10EffectVariable_AsDepthStencil(This) (This)->lpVtbl->AsDepthStencil(This)
#define ID3D10EffectVariable_AsRasterizer(This) (This)->lpVtbl->AsRasterizer(This)
#define ID3D10EffectVariable_AsSampler(This) (This)->lpVtbl->AsSampler(This)
#define ID3D10EffectVariable_SetRawValue(This,data,offset,count) (This)->lpVtbl->SetRawValue(This,data,offset,count)
#define ID3D10EffectVariable_GetRawValue(This,data,offset,count) (This)->lpVtbl->GetRawValue(This,data,offset,count)
#else
/*** ID3D10EffectVariable methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectVariable_IsValid(ID3D10EffectVariable* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectVariable_GetType(ID3D10EffectVariable* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectVariable_GetDesc(ID3D10EffectVariable* This,D3D10_EFFECT_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectVariable_GetAnnotationByIndex(ID3D10EffectVariable* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectVariable_GetAnnotationByName(ID3D10EffectVariable* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectVariable_GetMemberByIndex(ID3D10EffectVariable* This,UINT index) {
    return This->lpVtbl->GetMemberByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectVariable_GetMemberByName(ID3D10EffectVariable* This,const char *name) {
    return This->lpVtbl->GetMemberByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectVariable_GetMemberBySemantic(ID3D10EffectVariable* This,const char *semantic) {
    return This->lpVtbl->GetMemberBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectVariable_GetElement(ID3D10EffectVariable* This,UINT index) {
    return This->lpVtbl->GetElement(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectVariable_GetParentConstantBuffer(ID3D10EffectVariable* This) {
    return This->lpVtbl->GetParentConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectScalarVariable * ID3D10EffectVariable_AsScalar(ID3D10EffectVariable* This) {
    return This->lpVtbl->AsScalar(This);
}
static __WIDL_INLINE ID3D10EffectVectorVariable * ID3D10EffectVariable_AsVector(ID3D10EffectVariable* This) {
    return This->lpVtbl->AsVector(This);
}
static __WIDL_INLINE ID3D10EffectMatrixVariable * ID3D10EffectVariable_AsMatrix(ID3D10EffectVariable* This) {
    return This->lpVtbl->AsMatrix(This);
}
static __WIDL_INLINE ID3D10EffectStringVariable * ID3D10EffectVariable_AsString(ID3D10EffectVariable* This) {
    return This->lpVtbl->AsString(This);
}
static __WIDL_INLINE ID3D10EffectShaderResourceVariable * ID3D10EffectVariable_AsShaderResource(ID3D10EffectVariable* This) {
    return This->lpVtbl->AsShaderResource(This);
}
static __WIDL_INLINE ID3D10EffectRenderTargetViewVariable * ID3D10EffectVariable_AsRenderTargetView(ID3D10EffectVariable* This) {
    return This->lpVtbl->AsRenderTargetView(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilViewVariable * ID3D10EffectVariable_AsDepthStencilView(ID3D10EffectVariable* This) {
    return This->lpVtbl->AsDepthStencilView(This);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectVariable_AsConstantBuffer(ID3D10EffectVariable* This) {
    return This->lpVtbl->AsConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectShaderVariable * ID3D10EffectVariable_AsShader(ID3D10EffectVariable* This) {
    return This->lpVtbl->AsShader(This);
}
static __WIDL_INLINE ID3D10EffectBlendVariable * ID3D10EffectVariable_AsBlend(ID3D10EffectVariable* This) {
    return This->lpVtbl->AsBlend(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilVariable * ID3D10EffectVariable_AsDepthStencil(ID3D10EffectVariable* This) {
    return This->lpVtbl->AsDepthStencil(This);
}
static __WIDL_INLINE ID3D10EffectRasterizerVariable * ID3D10EffectVariable_AsRasterizer(ID3D10EffectVariable* This) {
    return This->lpVtbl->AsRasterizer(This);
}
static __WIDL_INLINE ID3D10EffectSamplerVariable * ID3D10EffectVariable_AsSampler(ID3D10EffectVariable* This) {
    return This->lpVtbl->AsSampler(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectVariable_SetRawValue(ID3D10EffectVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->SetRawValue(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectVariable_GetRawValue(ID3D10EffectVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->GetRawValue(This,data,offset,count);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectConstantBuffer interface
 */
#ifndef __ID3D10EffectConstantBuffer_INTERFACE_DEFINED__
#define __ID3D10EffectConstantBuffer_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectConstantBuffer, 0x56648f4d, 0xcc8b, 0x4444, 0xa5,0xad, 0xb5,0xa3,0xd7,0x6e,0x91,0xb3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("56648f4d-cc8b-4444-a5ad-b5a3d76e91b3")
ID3D10EffectConstantBuffer : public ID3D10EffectVariable
{
    virtual HRESULT STDMETHODCALLTYPE SetConstantBuffer(
        ID3D10Buffer *buffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetConstantBuffer(
        ID3D10Buffer **buffer) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetTextureBuffer(
        ID3D10ShaderResourceView *view) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTextureBuffer(
        ID3D10ShaderResourceView **view) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectConstantBuffer, 0x56648f4d, 0xcc8b, 0x4444, 0xa5,0xad, 0xb5,0xa3,0xd7,0x6e,0x91,0xb3)
#endif
#else
typedef struct ID3D10EffectConstantBufferVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectVariable methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectConstantBuffer *This);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetType)(
        ID3D10EffectConstantBuffer *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectConstantBuffer *This,
        D3D10_EFFECT_VARIABLE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectConstantBuffer *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectConstantBuffer *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByIndex)(
        ID3D10EffectConstantBuffer *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByName)(
        ID3D10EffectConstantBuffer *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberBySemantic)(
        ID3D10EffectConstantBuffer *This,
        const char *semantic);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetElement)(
        ID3D10EffectConstantBuffer *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetParentConstantBuffer)(
        ID3D10EffectConstantBuffer *This);

    ID3D10EffectScalarVariable * (STDMETHODCALLTYPE *AsScalar)(
        ID3D10EffectConstantBuffer *This);

    ID3D10EffectVectorVariable * (STDMETHODCALLTYPE *AsVector)(
        ID3D10EffectConstantBuffer *This);

    ID3D10EffectMatrixVariable * (STDMETHODCALLTYPE *AsMatrix)(
        ID3D10EffectConstantBuffer *This);

    ID3D10EffectStringVariable * (STDMETHODCALLTYPE *AsString)(
        ID3D10EffectConstantBuffer *This);

    ID3D10EffectShaderResourceVariable * (STDMETHODCALLTYPE *AsShaderResource)(
        ID3D10EffectConstantBuffer *This);

    ID3D10EffectRenderTargetViewVariable * (STDMETHODCALLTYPE *AsRenderTargetView)(
        ID3D10EffectConstantBuffer *This);

    ID3D10EffectDepthStencilViewVariable * (STDMETHODCALLTYPE *AsDepthStencilView)(
        ID3D10EffectConstantBuffer *This);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *AsConstantBuffer)(
        ID3D10EffectConstantBuffer *This);

    ID3D10EffectShaderVariable * (STDMETHODCALLTYPE *AsShader)(
        ID3D10EffectConstantBuffer *This);

    ID3D10EffectBlendVariable * (STDMETHODCALLTYPE *AsBlend)(
        ID3D10EffectConstantBuffer *This);

    ID3D10EffectDepthStencilVariable * (STDMETHODCALLTYPE *AsDepthStencil)(
        ID3D10EffectConstantBuffer *This);

    ID3D10EffectRasterizerVariable * (STDMETHODCALLTYPE *AsRasterizer)(
        ID3D10EffectConstantBuffer *This);

    ID3D10EffectSamplerVariable * (STDMETHODCALLTYPE *AsSampler)(
        ID3D10EffectConstantBuffer *This);

    HRESULT (STDMETHODCALLTYPE *SetRawValue)(
        ID3D10EffectConstantBuffer *This,
        void *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRawValue)(
        ID3D10EffectConstantBuffer *This,
        void *data,
        UINT offset,
        UINT count);

    /*** ID3D10EffectConstantBuffer methods ***/
    HRESULT (STDMETHODCALLTYPE *SetConstantBuffer)(
        ID3D10EffectConstantBuffer *This,
        ID3D10Buffer *buffer);

    HRESULT (STDMETHODCALLTYPE *GetConstantBuffer)(
        ID3D10EffectConstantBuffer *This,
        ID3D10Buffer **buffer);

    HRESULT (STDMETHODCALLTYPE *SetTextureBuffer)(
        ID3D10EffectConstantBuffer *This,
        ID3D10ShaderResourceView *view);

    HRESULT (STDMETHODCALLTYPE *GetTextureBuffer)(
        ID3D10EffectConstantBuffer *This,
        ID3D10ShaderResourceView **view);

    END_INTERFACE
} ID3D10EffectConstantBufferVtbl;

interface ID3D10EffectConstantBuffer {
    CONST_VTBL ID3D10EffectConstantBufferVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectVariable methods ***/
#define ID3D10EffectConstantBuffer_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectConstantBuffer_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D10EffectConstantBuffer_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectConstantBuffer_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectConstantBuffer_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectConstantBuffer_GetMemberByIndex(This,index) (This)->lpVtbl->GetMemberByIndex(This,index)
#define ID3D10EffectConstantBuffer_GetMemberByName(This,name) (This)->lpVtbl->GetMemberByName(This,name)
#define ID3D10EffectConstantBuffer_GetMemberBySemantic(This,semantic) (This)->lpVtbl->GetMemberBySemantic(This,semantic)
#define ID3D10EffectConstantBuffer_GetElement(This,index) (This)->lpVtbl->GetElement(This,index)
#define ID3D10EffectConstantBuffer_GetParentConstantBuffer(This) (This)->lpVtbl->GetParentConstantBuffer(This)
#define ID3D10EffectConstantBuffer_AsScalar(This) (This)->lpVtbl->AsScalar(This)
#define ID3D10EffectConstantBuffer_AsVector(This) (This)->lpVtbl->AsVector(This)
#define ID3D10EffectConstantBuffer_AsMatrix(This) (This)->lpVtbl->AsMatrix(This)
#define ID3D10EffectConstantBuffer_AsString(This) (This)->lpVtbl->AsString(This)
#define ID3D10EffectConstantBuffer_AsShaderResource(This) (This)->lpVtbl->AsShaderResource(This)
#define ID3D10EffectConstantBuffer_AsRenderTargetView(This) (This)->lpVtbl->AsRenderTargetView(This)
#define ID3D10EffectConstantBuffer_AsDepthStencilView(This) (This)->lpVtbl->AsDepthStencilView(This)
#define ID3D10EffectConstantBuffer_AsConstantBuffer(This) (This)->lpVtbl->AsConstantBuffer(This)
#define ID3D10EffectConstantBuffer_AsShader(This) (This)->lpVtbl->AsShader(This)
#define ID3D10EffectConstantBuffer_AsBlend(This) (This)->lpVtbl->AsBlend(This)
#define ID3D10EffectConstantBuffer_AsDepthStencil(This) (This)->lpVtbl->AsDepthStencil(This)
#define ID3D10EffectConstantBuffer_AsRasterizer(This) (This)->lpVtbl->AsRasterizer(This)
#define ID3D10EffectConstantBuffer_AsSampler(This) (This)->lpVtbl->AsSampler(This)
#define ID3D10EffectConstantBuffer_SetRawValue(This,data,offset,count) (This)->lpVtbl->SetRawValue(This,data,offset,count)
#define ID3D10EffectConstantBuffer_GetRawValue(This,data,offset,count) (This)->lpVtbl->GetRawValue(This,data,offset,count)
/*** ID3D10EffectConstantBuffer methods ***/
#define ID3D10EffectConstantBuffer_SetConstantBuffer(This,buffer) (This)->lpVtbl->SetConstantBuffer(This,buffer)
#define ID3D10EffectConstantBuffer_GetConstantBuffer(This,buffer) (This)->lpVtbl->GetConstantBuffer(This,buffer)
#define ID3D10EffectConstantBuffer_SetTextureBuffer(This,view) (This)->lpVtbl->SetTextureBuffer(This,view)
#define ID3D10EffectConstantBuffer_GetTextureBuffer(This,view) (This)->lpVtbl->GetTextureBuffer(This,view)
#else
/*** ID3D10EffectVariable methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectConstantBuffer_IsValid(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectConstantBuffer_GetType(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectConstantBuffer_GetDesc(ID3D10EffectConstantBuffer* This,D3D10_EFFECT_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectConstantBuffer_GetAnnotationByIndex(ID3D10EffectConstantBuffer* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectConstantBuffer_GetAnnotationByName(ID3D10EffectConstantBuffer* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectConstantBuffer_GetMemberByIndex(ID3D10EffectConstantBuffer* This,UINT index) {
    return This->lpVtbl->GetMemberByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectConstantBuffer_GetMemberByName(ID3D10EffectConstantBuffer* This,const char *name) {
    return This->lpVtbl->GetMemberByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectConstantBuffer_GetMemberBySemantic(ID3D10EffectConstantBuffer* This,const char *semantic) {
    return This->lpVtbl->GetMemberBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectConstantBuffer_GetElement(ID3D10EffectConstantBuffer* This,UINT index) {
    return This->lpVtbl->GetElement(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectConstantBuffer_GetParentConstantBuffer(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->GetParentConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectScalarVariable * ID3D10EffectConstantBuffer_AsScalar(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->AsScalar(This);
}
static __WIDL_INLINE ID3D10EffectVectorVariable * ID3D10EffectConstantBuffer_AsVector(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->AsVector(This);
}
static __WIDL_INLINE ID3D10EffectMatrixVariable * ID3D10EffectConstantBuffer_AsMatrix(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->AsMatrix(This);
}
static __WIDL_INLINE ID3D10EffectStringVariable * ID3D10EffectConstantBuffer_AsString(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->AsString(This);
}
static __WIDL_INLINE ID3D10EffectShaderResourceVariable * ID3D10EffectConstantBuffer_AsShaderResource(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->AsShaderResource(This);
}
static __WIDL_INLINE ID3D10EffectRenderTargetViewVariable * ID3D10EffectConstantBuffer_AsRenderTargetView(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->AsRenderTargetView(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilViewVariable * ID3D10EffectConstantBuffer_AsDepthStencilView(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->AsDepthStencilView(This);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectConstantBuffer_AsConstantBuffer(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->AsConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectShaderVariable * ID3D10EffectConstantBuffer_AsShader(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->AsShader(This);
}
static __WIDL_INLINE ID3D10EffectBlendVariable * ID3D10EffectConstantBuffer_AsBlend(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->AsBlend(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilVariable * ID3D10EffectConstantBuffer_AsDepthStencil(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->AsDepthStencil(This);
}
static __WIDL_INLINE ID3D10EffectRasterizerVariable * ID3D10EffectConstantBuffer_AsRasterizer(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->AsRasterizer(This);
}
static __WIDL_INLINE ID3D10EffectSamplerVariable * ID3D10EffectConstantBuffer_AsSampler(ID3D10EffectConstantBuffer* This) {
    return This->lpVtbl->AsSampler(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectConstantBuffer_SetRawValue(ID3D10EffectConstantBuffer* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->SetRawValue(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectConstantBuffer_GetRawValue(ID3D10EffectConstantBuffer* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->GetRawValue(This,data,offset,count);
}
/*** ID3D10EffectConstantBuffer methods ***/
static __WIDL_INLINE HRESULT ID3D10EffectConstantBuffer_SetConstantBuffer(ID3D10EffectConstantBuffer* This,ID3D10Buffer *buffer) {
    return This->lpVtbl->SetConstantBuffer(This,buffer);
}
static __WIDL_INLINE HRESULT ID3D10EffectConstantBuffer_GetConstantBuffer(ID3D10EffectConstantBuffer* This,ID3D10Buffer **buffer) {
    return This->lpVtbl->GetConstantBuffer(This,buffer);
}
static __WIDL_INLINE HRESULT ID3D10EffectConstantBuffer_SetTextureBuffer(ID3D10EffectConstantBuffer* This,ID3D10ShaderResourceView *view) {
    return This->lpVtbl->SetTextureBuffer(This,view);
}
static __WIDL_INLINE HRESULT ID3D10EffectConstantBuffer_GetTextureBuffer(ID3D10EffectConstantBuffer* This,ID3D10ShaderResourceView **view) {
    return This->lpVtbl->GetTextureBuffer(This,view);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectConstantBuffer_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectScalarVariable interface
 */
#ifndef __ID3D10EffectScalarVariable_INTERFACE_DEFINED__
#define __ID3D10EffectScalarVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectScalarVariable, 0x00e48f7b, 0xd2c8, 0x49e8, 0xa8,0x6c, 0x02,0x2d,0xee,0x53,0x43,0x1f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("00e48f7b-d2c8-49e8-a86c-022dee53431f")
ID3D10EffectScalarVariable : public ID3D10EffectVariable
{
    virtual HRESULT STDMETHODCALLTYPE SetFloat(
        float value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFloat(
        float *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFloatArray(
        float *values,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFloatArray(
        float *values,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetInt(
        int value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInt(
        int *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIntArray(
        int *values,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIntArray(
        int *values,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBool(
        WINBOOL value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBool(
        WINBOOL *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBoolArray(
        WINBOOL *values,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBoolArray(
        WINBOOL *values,
        UINT offset,
        UINT count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectScalarVariable, 0x00e48f7b, 0xd2c8, 0x49e8, 0xa8,0x6c, 0x02,0x2d,0xee,0x53,0x43,0x1f)
#endif
#else
typedef struct ID3D10EffectScalarVariableVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectVariable methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectScalarVariable *This);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetType)(
        ID3D10EffectScalarVariable *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectScalarVariable *This,
        D3D10_EFFECT_VARIABLE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectScalarVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectScalarVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByIndex)(
        ID3D10EffectScalarVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByName)(
        ID3D10EffectScalarVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberBySemantic)(
        ID3D10EffectScalarVariable *This,
        const char *semantic);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetElement)(
        ID3D10EffectScalarVariable *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetParentConstantBuffer)(
        ID3D10EffectScalarVariable *This);

    ID3D10EffectScalarVariable * (STDMETHODCALLTYPE *AsScalar)(
        ID3D10EffectScalarVariable *This);

    ID3D10EffectVectorVariable * (STDMETHODCALLTYPE *AsVector)(
        ID3D10EffectScalarVariable *This);

    ID3D10EffectMatrixVariable * (STDMETHODCALLTYPE *AsMatrix)(
        ID3D10EffectScalarVariable *This);

    ID3D10EffectStringVariable * (STDMETHODCALLTYPE *AsString)(
        ID3D10EffectScalarVariable *This);

    ID3D10EffectShaderResourceVariable * (STDMETHODCALLTYPE *AsShaderResource)(
        ID3D10EffectScalarVariable *This);

    ID3D10EffectRenderTargetViewVariable * (STDMETHODCALLTYPE *AsRenderTargetView)(
        ID3D10EffectScalarVariable *This);

    ID3D10EffectDepthStencilViewVariable * (STDMETHODCALLTYPE *AsDepthStencilView)(
        ID3D10EffectScalarVariable *This);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *AsConstantBuffer)(
        ID3D10EffectScalarVariable *This);

    ID3D10EffectShaderVariable * (STDMETHODCALLTYPE *AsShader)(
        ID3D10EffectScalarVariable *This);

    ID3D10EffectBlendVariable * (STDMETHODCALLTYPE *AsBlend)(
        ID3D10EffectScalarVariable *This);

    ID3D10EffectDepthStencilVariable * (STDMETHODCALLTYPE *AsDepthStencil)(
        ID3D10EffectScalarVariable *This);

    ID3D10EffectRasterizerVariable * (STDMETHODCALLTYPE *AsRasterizer)(
        ID3D10EffectScalarVariable *This);

    ID3D10EffectSamplerVariable * (STDMETHODCALLTYPE *AsSampler)(
        ID3D10EffectScalarVariable *This);

    HRESULT (STDMETHODCALLTYPE *SetRawValue)(
        ID3D10EffectScalarVariable *This,
        void *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRawValue)(
        ID3D10EffectScalarVariable *This,
        void *data,
        UINT offset,
        UINT count);

    /*** ID3D10EffectScalarVariable methods ***/
    HRESULT (STDMETHODCALLTYPE *SetFloat)(
        ID3D10EffectScalarVariable *This,
        float value);

    HRESULT (STDMETHODCALLTYPE *GetFloat)(
        ID3D10EffectScalarVariable *This,
        float *value);

    HRESULT (STDMETHODCALLTYPE *SetFloatArray)(
        ID3D10EffectScalarVariable *This,
        float *values,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetFloatArray)(
        ID3D10EffectScalarVariable *This,
        float *values,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *SetInt)(
        ID3D10EffectScalarVariable *This,
        int value);

    HRESULT (STDMETHODCALLTYPE *GetInt)(
        ID3D10EffectScalarVariable *This,
        int *value);

    HRESULT (STDMETHODCALLTYPE *SetIntArray)(
        ID3D10EffectScalarVariable *This,
        int *values,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetIntArray)(
        ID3D10EffectScalarVariable *This,
        int *values,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *SetBool)(
        ID3D10EffectScalarVariable *This,
        WINBOOL value);

    HRESULT (STDMETHODCALLTYPE *GetBool)(
        ID3D10EffectScalarVariable *This,
        WINBOOL *value);

    HRESULT (STDMETHODCALLTYPE *SetBoolArray)(
        ID3D10EffectScalarVariable *This,
        WINBOOL *values,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetBoolArray)(
        ID3D10EffectScalarVariable *This,
        WINBOOL *values,
        UINT offset,
        UINT count);

    END_INTERFACE
} ID3D10EffectScalarVariableVtbl;

interface ID3D10EffectScalarVariable {
    CONST_VTBL ID3D10EffectScalarVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectVariable methods ***/
#define ID3D10EffectScalarVariable_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectScalarVariable_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D10EffectScalarVariable_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectScalarVariable_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectScalarVariable_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectScalarVariable_GetMemberByIndex(This,index) (This)->lpVtbl->GetMemberByIndex(This,index)
#define ID3D10EffectScalarVariable_GetMemberByName(This,name) (This)->lpVtbl->GetMemberByName(This,name)
#define ID3D10EffectScalarVariable_GetMemberBySemantic(This,semantic) (This)->lpVtbl->GetMemberBySemantic(This,semantic)
#define ID3D10EffectScalarVariable_GetElement(This,index) (This)->lpVtbl->GetElement(This,index)
#define ID3D10EffectScalarVariable_GetParentConstantBuffer(This) (This)->lpVtbl->GetParentConstantBuffer(This)
#define ID3D10EffectScalarVariable_AsScalar(This) (This)->lpVtbl->AsScalar(This)
#define ID3D10EffectScalarVariable_AsVector(This) (This)->lpVtbl->AsVector(This)
#define ID3D10EffectScalarVariable_AsMatrix(This) (This)->lpVtbl->AsMatrix(This)
#define ID3D10EffectScalarVariable_AsString(This) (This)->lpVtbl->AsString(This)
#define ID3D10EffectScalarVariable_AsShaderResource(This) (This)->lpVtbl->AsShaderResource(This)
#define ID3D10EffectScalarVariable_AsRenderTargetView(This) (This)->lpVtbl->AsRenderTargetView(This)
#define ID3D10EffectScalarVariable_AsDepthStencilView(This) (This)->lpVtbl->AsDepthStencilView(This)
#define ID3D10EffectScalarVariable_AsConstantBuffer(This) (This)->lpVtbl->AsConstantBuffer(This)
#define ID3D10EffectScalarVariable_AsShader(This) (This)->lpVtbl->AsShader(This)
#define ID3D10EffectScalarVariable_AsBlend(This) (This)->lpVtbl->AsBlend(This)
#define ID3D10EffectScalarVariable_AsDepthStencil(This) (This)->lpVtbl->AsDepthStencil(This)
#define ID3D10EffectScalarVariable_AsRasterizer(This) (This)->lpVtbl->AsRasterizer(This)
#define ID3D10EffectScalarVariable_AsSampler(This) (This)->lpVtbl->AsSampler(This)
#define ID3D10EffectScalarVariable_SetRawValue(This,data,offset,count) (This)->lpVtbl->SetRawValue(This,data,offset,count)
#define ID3D10EffectScalarVariable_GetRawValue(This,data,offset,count) (This)->lpVtbl->GetRawValue(This,data,offset,count)
/*** ID3D10EffectScalarVariable methods ***/
#define ID3D10EffectScalarVariable_SetFloat(This,value) (This)->lpVtbl->SetFloat(This,value)
#define ID3D10EffectScalarVariable_GetFloat(This,value) (This)->lpVtbl->GetFloat(This,value)
#define ID3D10EffectScalarVariable_SetFloatArray(This,values,offset,count) (This)->lpVtbl->SetFloatArray(This,values,offset,count)
#define ID3D10EffectScalarVariable_GetFloatArray(This,values,offset,count) (This)->lpVtbl->GetFloatArray(This,values,offset,count)
#define ID3D10EffectScalarVariable_SetInt(This,value) (This)->lpVtbl->SetInt(This,value)
#define ID3D10EffectScalarVariable_GetInt(This,value) (This)->lpVtbl->GetInt(This,value)
#define ID3D10EffectScalarVariable_SetIntArray(This,values,offset,count) (This)->lpVtbl->SetIntArray(This,values,offset,count)
#define ID3D10EffectScalarVariable_GetIntArray(This,values,offset,count) (This)->lpVtbl->GetIntArray(This,values,offset,count)
#define ID3D10EffectScalarVariable_SetBool(This,value) (This)->lpVtbl->SetBool(This,value)
#define ID3D10EffectScalarVariable_GetBool(This,value) (This)->lpVtbl->GetBool(This,value)
#define ID3D10EffectScalarVariable_SetBoolArray(This,values,offset,count) (This)->lpVtbl->SetBoolArray(This,values,offset,count)
#define ID3D10EffectScalarVariable_GetBoolArray(This,values,offset,count) (This)->lpVtbl->GetBoolArray(This,values,offset,count)
#else
/*** ID3D10EffectVariable methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectScalarVariable_IsValid(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectScalarVariable_GetType(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_GetDesc(ID3D10EffectScalarVariable* This,D3D10_EFFECT_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectScalarVariable_GetAnnotationByIndex(ID3D10EffectScalarVariable* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectScalarVariable_GetAnnotationByName(ID3D10EffectScalarVariable* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectScalarVariable_GetMemberByIndex(ID3D10EffectScalarVariable* This,UINT index) {
    return This->lpVtbl->GetMemberByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectScalarVariable_GetMemberByName(ID3D10EffectScalarVariable* This,const char *name) {
    return This->lpVtbl->GetMemberByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectScalarVariable_GetMemberBySemantic(ID3D10EffectScalarVariable* This,const char *semantic) {
    return This->lpVtbl->GetMemberBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectScalarVariable_GetElement(ID3D10EffectScalarVariable* This,UINT index) {
    return This->lpVtbl->GetElement(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectScalarVariable_GetParentConstantBuffer(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->GetParentConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectScalarVariable * ID3D10EffectScalarVariable_AsScalar(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->AsScalar(This);
}
static __WIDL_INLINE ID3D10EffectVectorVariable * ID3D10EffectScalarVariable_AsVector(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->AsVector(This);
}
static __WIDL_INLINE ID3D10EffectMatrixVariable * ID3D10EffectScalarVariable_AsMatrix(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->AsMatrix(This);
}
static __WIDL_INLINE ID3D10EffectStringVariable * ID3D10EffectScalarVariable_AsString(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->AsString(This);
}
static __WIDL_INLINE ID3D10EffectShaderResourceVariable * ID3D10EffectScalarVariable_AsShaderResource(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->AsShaderResource(This);
}
static __WIDL_INLINE ID3D10EffectRenderTargetViewVariable * ID3D10EffectScalarVariable_AsRenderTargetView(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->AsRenderTargetView(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilViewVariable * ID3D10EffectScalarVariable_AsDepthStencilView(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->AsDepthStencilView(This);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectScalarVariable_AsConstantBuffer(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->AsConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectShaderVariable * ID3D10EffectScalarVariable_AsShader(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->AsShader(This);
}
static __WIDL_INLINE ID3D10EffectBlendVariable * ID3D10EffectScalarVariable_AsBlend(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->AsBlend(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilVariable * ID3D10EffectScalarVariable_AsDepthStencil(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->AsDepthStencil(This);
}
static __WIDL_INLINE ID3D10EffectRasterizerVariable * ID3D10EffectScalarVariable_AsRasterizer(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->AsRasterizer(This);
}
static __WIDL_INLINE ID3D10EffectSamplerVariable * ID3D10EffectScalarVariable_AsSampler(ID3D10EffectScalarVariable* This) {
    return This->lpVtbl->AsSampler(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_SetRawValue(ID3D10EffectScalarVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->SetRawValue(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_GetRawValue(ID3D10EffectScalarVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->GetRawValue(This,data,offset,count);
}
/*** ID3D10EffectScalarVariable methods ***/
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_SetFloat(ID3D10EffectScalarVariable* This,float value) {
    return This->lpVtbl->SetFloat(This,value);
}
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_GetFloat(ID3D10EffectScalarVariable* This,float *value) {
    return This->lpVtbl->GetFloat(This,value);
}
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_SetFloatArray(ID3D10EffectScalarVariable* This,float *values,UINT offset,UINT count) {
    return This->lpVtbl->SetFloatArray(This,values,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_GetFloatArray(ID3D10EffectScalarVariable* This,float *values,UINT offset,UINT count) {
    return This->lpVtbl->GetFloatArray(This,values,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_SetInt(ID3D10EffectScalarVariable* This,int value) {
    return This->lpVtbl->SetInt(This,value);
}
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_GetInt(ID3D10EffectScalarVariable* This,int *value) {
    return This->lpVtbl->GetInt(This,value);
}
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_SetIntArray(ID3D10EffectScalarVariable* This,int *values,UINT offset,UINT count) {
    return This->lpVtbl->SetIntArray(This,values,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_GetIntArray(ID3D10EffectScalarVariable* This,int *values,UINT offset,UINT count) {
    return This->lpVtbl->GetIntArray(This,values,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_SetBool(ID3D10EffectScalarVariable* This,WINBOOL value) {
    return This->lpVtbl->SetBool(This,value);
}
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_GetBool(ID3D10EffectScalarVariable* This,WINBOOL *value) {
    return This->lpVtbl->GetBool(This,value);
}
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_SetBoolArray(ID3D10EffectScalarVariable* This,WINBOOL *values,UINT offset,UINT count) {
    return This->lpVtbl->SetBoolArray(This,values,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectScalarVariable_GetBoolArray(ID3D10EffectScalarVariable* This,WINBOOL *values,UINT offset,UINT count) {
    return This->lpVtbl->GetBoolArray(This,values,offset,count);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectScalarVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectVectorVariable interface
 */
#ifndef __ID3D10EffectVectorVariable_INTERFACE_DEFINED__
#define __ID3D10EffectVectorVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectVectorVariable, 0x62b98c44, 0x1f82, 0x4c67, 0xbc,0xd0, 0x72,0xcf,0x8f,0x21,0x7e,0x81);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("62b98c44-1f82-4c67-bcd0-72cf8f217e81")
ID3D10EffectVectorVariable : public ID3D10EffectVariable
{
    virtual HRESULT STDMETHODCALLTYPE SetBoolVector(
        WINBOOL *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIntVector(
        int *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFloatVector(
        float *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBoolVector(
        WINBOOL *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIntVector(
        int *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFloatVector(
        float *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetBoolVectorArray(
        WINBOOL *values,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetIntVectorArray(
        int *values,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFloatVectorArray(
        float *values,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBoolVectorArray(
        WINBOOL *values,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetIntVectorArray(
        int *values,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFloatVectorArray(
        float *values,
        UINT offset,
        UINT count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectVectorVariable, 0x62b98c44, 0x1f82, 0x4c67, 0xbc,0xd0, 0x72,0xcf,0x8f,0x21,0x7e,0x81)
#endif
#else
typedef struct ID3D10EffectVectorVariableVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectVariable methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectVectorVariable *This);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetType)(
        ID3D10EffectVectorVariable *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectVectorVariable *This,
        D3D10_EFFECT_VARIABLE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectVectorVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectVectorVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByIndex)(
        ID3D10EffectVectorVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByName)(
        ID3D10EffectVectorVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberBySemantic)(
        ID3D10EffectVectorVariable *This,
        const char *semantic);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetElement)(
        ID3D10EffectVectorVariable *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetParentConstantBuffer)(
        ID3D10EffectVectorVariable *This);

    ID3D10EffectScalarVariable * (STDMETHODCALLTYPE *AsScalar)(
        ID3D10EffectVectorVariable *This);

    ID3D10EffectVectorVariable * (STDMETHODCALLTYPE *AsVector)(
        ID3D10EffectVectorVariable *This);

    ID3D10EffectMatrixVariable * (STDMETHODCALLTYPE *AsMatrix)(
        ID3D10EffectVectorVariable *This);

    ID3D10EffectStringVariable * (STDMETHODCALLTYPE *AsString)(
        ID3D10EffectVectorVariable *This);

    ID3D10EffectShaderResourceVariable * (STDMETHODCALLTYPE *AsShaderResource)(
        ID3D10EffectVectorVariable *This);

    ID3D10EffectRenderTargetViewVariable * (STDMETHODCALLTYPE *AsRenderTargetView)(
        ID3D10EffectVectorVariable *This);

    ID3D10EffectDepthStencilViewVariable * (STDMETHODCALLTYPE *AsDepthStencilView)(
        ID3D10EffectVectorVariable *This);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *AsConstantBuffer)(
        ID3D10EffectVectorVariable *This);

    ID3D10EffectShaderVariable * (STDMETHODCALLTYPE *AsShader)(
        ID3D10EffectVectorVariable *This);

    ID3D10EffectBlendVariable * (STDMETHODCALLTYPE *AsBlend)(
        ID3D10EffectVectorVariable *This);

    ID3D10EffectDepthStencilVariable * (STDMETHODCALLTYPE *AsDepthStencil)(
        ID3D10EffectVectorVariable *This);

    ID3D10EffectRasterizerVariable * (STDMETHODCALLTYPE *AsRasterizer)(
        ID3D10EffectVectorVariable *This);

    ID3D10EffectSamplerVariable * (STDMETHODCALLTYPE *AsSampler)(
        ID3D10EffectVectorVariable *This);

    HRESULT (STDMETHODCALLTYPE *SetRawValue)(
        ID3D10EffectVectorVariable *This,
        void *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRawValue)(
        ID3D10EffectVectorVariable *This,
        void *data,
        UINT offset,
        UINT count);

    /*** ID3D10EffectVectorVariable methods ***/
    HRESULT (STDMETHODCALLTYPE *SetBoolVector)(
        ID3D10EffectVectorVariable *This,
        WINBOOL *value);

    HRESULT (STDMETHODCALLTYPE *SetIntVector)(
        ID3D10EffectVectorVariable *This,
        int *value);

    HRESULT (STDMETHODCALLTYPE *SetFloatVector)(
        ID3D10EffectVectorVariable *This,
        float *value);

    HRESULT (STDMETHODCALLTYPE *GetBoolVector)(
        ID3D10EffectVectorVariable *This,
        WINBOOL *value);

    HRESULT (STDMETHODCALLTYPE *GetIntVector)(
        ID3D10EffectVectorVariable *This,
        int *value);

    HRESULT (STDMETHODCALLTYPE *GetFloatVector)(
        ID3D10EffectVectorVariable *This,
        float *value);

    HRESULT (STDMETHODCALLTYPE *SetBoolVectorArray)(
        ID3D10EffectVectorVariable *This,
        WINBOOL *values,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *SetIntVectorArray)(
        ID3D10EffectVectorVariable *This,
        int *values,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *SetFloatVectorArray)(
        ID3D10EffectVectorVariable *This,
        float *values,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetBoolVectorArray)(
        ID3D10EffectVectorVariable *This,
        WINBOOL *values,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetIntVectorArray)(
        ID3D10EffectVectorVariable *This,
        int *values,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetFloatVectorArray)(
        ID3D10EffectVectorVariable *This,
        float *values,
        UINT offset,
        UINT count);

    END_INTERFACE
} ID3D10EffectVectorVariableVtbl;

interface ID3D10EffectVectorVariable {
    CONST_VTBL ID3D10EffectVectorVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectVariable methods ***/
#define ID3D10EffectVectorVariable_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectVectorVariable_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D10EffectVectorVariable_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectVectorVariable_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectVectorVariable_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectVectorVariable_GetMemberByIndex(This,index) (This)->lpVtbl->GetMemberByIndex(This,index)
#define ID3D10EffectVectorVariable_GetMemberByName(This,name) (This)->lpVtbl->GetMemberByName(This,name)
#define ID3D10EffectVectorVariable_GetMemberBySemantic(This,semantic) (This)->lpVtbl->GetMemberBySemantic(This,semantic)
#define ID3D10EffectVectorVariable_GetElement(This,index) (This)->lpVtbl->GetElement(This,index)
#define ID3D10EffectVectorVariable_GetParentConstantBuffer(This) (This)->lpVtbl->GetParentConstantBuffer(This)
#define ID3D10EffectVectorVariable_AsScalar(This) (This)->lpVtbl->AsScalar(This)
#define ID3D10EffectVectorVariable_AsVector(This) (This)->lpVtbl->AsVector(This)
#define ID3D10EffectVectorVariable_AsMatrix(This) (This)->lpVtbl->AsMatrix(This)
#define ID3D10EffectVectorVariable_AsString(This) (This)->lpVtbl->AsString(This)
#define ID3D10EffectVectorVariable_AsShaderResource(This) (This)->lpVtbl->AsShaderResource(This)
#define ID3D10EffectVectorVariable_AsRenderTargetView(This) (This)->lpVtbl->AsRenderTargetView(This)
#define ID3D10EffectVectorVariable_AsDepthStencilView(This) (This)->lpVtbl->AsDepthStencilView(This)
#define ID3D10EffectVectorVariable_AsConstantBuffer(This) (This)->lpVtbl->AsConstantBuffer(This)
#define ID3D10EffectVectorVariable_AsShader(This) (This)->lpVtbl->AsShader(This)
#define ID3D10EffectVectorVariable_AsBlend(This) (This)->lpVtbl->AsBlend(This)
#define ID3D10EffectVectorVariable_AsDepthStencil(This) (This)->lpVtbl->AsDepthStencil(This)
#define ID3D10EffectVectorVariable_AsRasterizer(This) (This)->lpVtbl->AsRasterizer(This)
#define ID3D10EffectVectorVariable_AsSampler(This) (This)->lpVtbl->AsSampler(This)
#define ID3D10EffectVectorVariable_SetRawValue(This,data,offset,count) (This)->lpVtbl->SetRawValue(This,data,offset,count)
#define ID3D10EffectVectorVariable_GetRawValue(This,data,offset,count) (This)->lpVtbl->GetRawValue(This,data,offset,count)
/*** ID3D10EffectVectorVariable methods ***/
#define ID3D10EffectVectorVariable_SetBoolVector(This,value) (This)->lpVtbl->SetBoolVector(This,value)
#define ID3D10EffectVectorVariable_SetIntVector(This,value) (This)->lpVtbl->SetIntVector(This,value)
#define ID3D10EffectVectorVariable_SetFloatVector(This,value) (This)->lpVtbl->SetFloatVector(This,value)
#define ID3D10EffectVectorVariable_GetBoolVector(This,value) (This)->lpVtbl->GetBoolVector(This,value)
#define ID3D10EffectVectorVariable_GetIntVector(This,value) (This)->lpVtbl->GetIntVector(This,value)
#define ID3D10EffectVectorVariable_GetFloatVector(This,value) (This)->lpVtbl->GetFloatVector(This,value)
#define ID3D10EffectVectorVariable_SetBoolVectorArray(This,values,offset,count) (This)->lpVtbl->SetBoolVectorArray(This,values,offset,count)
#define ID3D10EffectVectorVariable_SetIntVectorArray(This,values,offset,count) (This)->lpVtbl->SetIntVectorArray(This,values,offset,count)
#define ID3D10EffectVectorVariable_SetFloatVectorArray(This,values,offset,count) (This)->lpVtbl->SetFloatVectorArray(This,values,offset,count)
#define ID3D10EffectVectorVariable_GetBoolVectorArray(This,values,offset,count) (This)->lpVtbl->GetBoolVectorArray(This,values,offset,count)
#define ID3D10EffectVectorVariable_GetIntVectorArray(This,values,offset,count) (This)->lpVtbl->GetIntVectorArray(This,values,offset,count)
#define ID3D10EffectVectorVariable_GetFloatVectorArray(This,values,offset,count) (This)->lpVtbl->GetFloatVectorArray(This,values,offset,count)
#else
/*** ID3D10EffectVariable methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectVectorVariable_IsValid(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectVectorVariable_GetType(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_GetDesc(ID3D10EffectVectorVariable* This,D3D10_EFFECT_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectVectorVariable_GetAnnotationByIndex(ID3D10EffectVectorVariable* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectVectorVariable_GetAnnotationByName(ID3D10EffectVectorVariable* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectVectorVariable_GetMemberByIndex(ID3D10EffectVectorVariable* This,UINT index) {
    return This->lpVtbl->GetMemberByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectVectorVariable_GetMemberByName(ID3D10EffectVectorVariable* This,const char *name) {
    return This->lpVtbl->GetMemberByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectVectorVariable_GetMemberBySemantic(ID3D10EffectVectorVariable* This,const char *semantic) {
    return This->lpVtbl->GetMemberBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectVectorVariable_GetElement(ID3D10EffectVectorVariable* This,UINT index) {
    return This->lpVtbl->GetElement(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectVectorVariable_GetParentConstantBuffer(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->GetParentConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectScalarVariable * ID3D10EffectVectorVariable_AsScalar(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->AsScalar(This);
}
static __WIDL_INLINE ID3D10EffectVectorVariable * ID3D10EffectVectorVariable_AsVector(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->AsVector(This);
}
static __WIDL_INLINE ID3D10EffectMatrixVariable * ID3D10EffectVectorVariable_AsMatrix(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->AsMatrix(This);
}
static __WIDL_INLINE ID3D10EffectStringVariable * ID3D10EffectVectorVariable_AsString(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->AsString(This);
}
static __WIDL_INLINE ID3D10EffectShaderResourceVariable * ID3D10EffectVectorVariable_AsShaderResource(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->AsShaderResource(This);
}
static __WIDL_INLINE ID3D10EffectRenderTargetViewVariable * ID3D10EffectVectorVariable_AsRenderTargetView(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->AsRenderTargetView(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilViewVariable * ID3D10EffectVectorVariable_AsDepthStencilView(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->AsDepthStencilView(This);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectVectorVariable_AsConstantBuffer(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->AsConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectShaderVariable * ID3D10EffectVectorVariable_AsShader(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->AsShader(This);
}
static __WIDL_INLINE ID3D10EffectBlendVariable * ID3D10EffectVectorVariable_AsBlend(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->AsBlend(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilVariable * ID3D10EffectVectorVariable_AsDepthStencil(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->AsDepthStencil(This);
}
static __WIDL_INLINE ID3D10EffectRasterizerVariable * ID3D10EffectVectorVariable_AsRasterizer(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->AsRasterizer(This);
}
static __WIDL_INLINE ID3D10EffectSamplerVariable * ID3D10EffectVectorVariable_AsSampler(ID3D10EffectVectorVariable* This) {
    return This->lpVtbl->AsSampler(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_SetRawValue(ID3D10EffectVectorVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->SetRawValue(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_GetRawValue(ID3D10EffectVectorVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->GetRawValue(This,data,offset,count);
}
/*** ID3D10EffectVectorVariable methods ***/
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_SetBoolVector(ID3D10EffectVectorVariable* This,WINBOOL *value) {
    return This->lpVtbl->SetBoolVector(This,value);
}
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_SetIntVector(ID3D10EffectVectorVariable* This,int *value) {
    return This->lpVtbl->SetIntVector(This,value);
}
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_SetFloatVector(ID3D10EffectVectorVariable* This,float *value) {
    return This->lpVtbl->SetFloatVector(This,value);
}
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_GetBoolVector(ID3D10EffectVectorVariable* This,WINBOOL *value) {
    return This->lpVtbl->GetBoolVector(This,value);
}
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_GetIntVector(ID3D10EffectVectorVariable* This,int *value) {
    return This->lpVtbl->GetIntVector(This,value);
}
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_GetFloatVector(ID3D10EffectVectorVariable* This,float *value) {
    return This->lpVtbl->GetFloatVector(This,value);
}
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_SetBoolVectorArray(ID3D10EffectVectorVariable* This,WINBOOL *values,UINT offset,UINT count) {
    return This->lpVtbl->SetBoolVectorArray(This,values,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_SetIntVectorArray(ID3D10EffectVectorVariable* This,int *values,UINT offset,UINT count) {
    return This->lpVtbl->SetIntVectorArray(This,values,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_SetFloatVectorArray(ID3D10EffectVectorVariable* This,float *values,UINT offset,UINT count) {
    return This->lpVtbl->SetFloatVectorArray(This,values,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_GetBoolVectorArray(ID3D10EffectVectorVariable* This,WINBOOL *values,UINT offset,UINT count) {
    return This->lpVtbl->GetBoolVectorArray(This,values,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_GetIntVectorArray(ID3D10EffectVectorVariable* This,int *values,UINT offset,UINT count) {
    return This->lpVtbl->GetIntVectorArray(This,values,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectVectorVariable_GetFloatVectorArray(ID3D10EffectVectorVariable* This,float *values,UINT offset,UINT count) {
    return This->lpVtbl->GetFloatVectorArray(This,values,offset,count);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectVectorVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectMatrixVariable interface
 */
#ifndef __ID3D10EffectMatrixVariable_INTERFACE_DEFINED__
#define __ID3D10EffectMatrixVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectMatrixVariable, 0x50666c24, 0xb82f, 0x4eed, 0xa1,0x72, 0x5b,0x6e,0x7e,0x85,0x22,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50666c24-b82f-4eed-a172-5b6e7e8522e0")
ID3D10EffectMatrixVariable : public ID3D10EffectVariable
{
    virtual HRESULT STDMETHODCALLTYPE SetMatrix(
        float *data) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMatrix(
        float *data) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMatrixArray(
        float *data,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMatrixArray(
        float *data,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMatrixTranspose(
        float *data) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMatrixTranspose(
        float *data) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetMatrixTransposeArray(
        float *data,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetMatrixTransposeArray(
        float *data,
        UINT offset,
        UINT count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectMatrixVariable, 0x50666c24, 0xb82f, 0x4eed, 0xa1,0x72, 0x5b,0x6e,0x7e,0x85,0x22,0xe0)
#endif
#else
typedef struct ID3D10EffectMatrixVariableVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectVariable methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectMatrixVariable *This);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetType)(
        ID3D10EffectMatrixVariable *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectMatrixVariable *This,
        D3D10_EFFECT_VARIABLE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectMatrixVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectMatrixVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByIndex)(
        ID3D10EffectMatrixVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByName)(
        ID3D10EffectMatrixVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberBySemantic)(
        ID3D10EffectMatrixVariable *This,
        const char *semantic);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetElement)(
        ID3D10EffectMatrixVariable *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetParentConstantBuffer)(
        ID3D10EffectMatrixVariable *This);

    ID3D10EffectScalarVariable * (STDMETHODCALLTYPE *AsScalar)(
        ID3D10EffectMatrixVariable *This);

    ID3D10EffectVectorVariable * (STDMETHODCALLTYPE *AsVector)(
        ID3D10EffectMatrixVariable *This);

    ID3D10EffectMatrixVariable * (STDMETHODCALLTYPE *AsMatrix)(
        ID3D10EffectMatrixVariable *This);

    ID3D10EffectStringVariable * (STDMETHODCALLTYPE *AsString)(
        ID3D10EffectMatrixVariable *This);

    ID3D10EffectShaderResourceVariable * (STDMETHODCALLTYPE *AsShaderResource)(
        ID3D10EffectMatrixVariable *This);

    ID3D10EffectRenderTargetViewVariable * (STDMETHODCALLTYPE *AsRenderTargetView)(
        ID3D10EffectMatrixVariable *This);

    ID3D10EffectDepthStencilViewVariable * (STDMETHODCALLTYPE *AsDepthStencilView)(
        ID3D10EffectMatrixVariable *This);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *AsConstantBuffer)(
        ID3D10EffectMatrixVariable *This);

    ID3D10EffectShaderVariable * (STDMETHODCALLTYPE *AsShader)(
        ID3D10EffectMatrixVariable *This);

    ID3D10EffectBlendVariable * (STDMETHODCALLTYPE *AsBlend)(
        ID3D10EffectMatrixVariable *This);

    ID3D10EffectDepthStencilVariable * (STDMETHODCALLTYPE *AsDepthStencil)(
        ID3D10EffectMatrixVariable *This);

    ID3D10EffectRasterizerVariable * (STDMETHODCALLTYPE *AsRasterizer)(
        ID3D10EffectMatrixVariable *This);

    ID3D10EffectSamplerVariable * (STDMETHODCALLTYPE *AsSampler)(
        ID3D10EffectMatrixVariable *This);

    HRESULT (STDMETHODCALLTYPE *SetRawValue)(
        ID3D10EffectMatrixVariable *This,
        void *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRawValue)(
        ID3D10EffectMatrixVariable *This,
        void *data,
        UINT offset,
        UINT count);

    /*** ID3D10EffectMatrixVariable methods ***/
    HRESULT (STDMETHODCALLTYPE *SetMatrix)(
        ID3D10EffectMatrixVariable *This,
        float *data);

    HRESULT (STDMETHODCALLTYPE *GetMatrix)(
        ID3D10EffectMatrixVariable *This,
        float *data);

    HRESULT (STDMETHODCALLTYPE *SetMatrixArray)(
        ID3D10EffectMatrixVariable *This,
        float *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetMatrixArray)(
        ID3D10EffectMatrixVariable *This,
        float *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *SetMatrixTranspose)(
        ID3D10EffectMatrixVariable *This,
        float *data);

    HRESULT (STDMETHODCALLTYPE *GetMatrixTranspose)(
        ID3D10EffectMatrixVariable *This,
        float *data);

    HRESULT (STDMETHODCALLTYPE *SetMatrixTransposeArray)(
        ID3D10EffectMatrixVariable *This,
        float *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetMatrixTransposeArray)(
        ID3D10EffectMatrixVariable *This,
        float *data,
        UINT offset,
        UINT count);

    END_INTERFACE
} ID3D10EffectMatrixVariableVtbl;

interface ID3D10EffectMatrixVariable {
    CONST_VTBL ID3D10EffectMatrixVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectVariable methods ***/
#define ID3D10EffectMatrixVariable_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectMatrixVariable_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D10EffectMatrixVariable_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectMatrixVariable_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectMatrixVariable_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectMatrixVariable_GetMemberByIndex(This,index) (This)->lpVtbl->GetMemberByIndex(This,index)
#define ID3D10EffectMatrixVariable_GetMemberByName(This,name) (This)->lpVtbl->GetMemberByName(This,name)
#define ID3D10EffectMatrixVariable_GetMemberBySemantic(This,semantic) (This)->lpVtbl->GetMemberBySemantic(This,semantic)
#define ID3D10EffectMatrixVariable_GetElement(This,index) (This)->lpVtbl->GetElement(This,index)
#define ID3D10EffectMatrixVariable_GetParentConstantBuffer(This) (This)->lpVtbl->GetParentConstantBuffer(This)
#define ID3D10EffectMatrixVariable_AsScalar(This) (This)->lpVtbl->AsScalar(This)
#define ID3D10EffectMatrixVariable_AsVector(This) (This)->lpVtbl->AsVector(This)
#define ID3D10EffectMatrixVariable_AsMatrix(This) (This)->lpVtbl->AsMatrix(This)
#define ID3D10EffectMatrixVariable_AsString(This) (This)->lpVtbl->AsString(This)
#define ID3D10EffectMatrixVariable_AsShaderResource(This) (This)->lpVtbl->AsShaderResource(This)
#define ID3D10EffectMatrixVariable_AsRenderTargetView(This) (This)->lpVtbl->AsRenderTargetView(This)
#define ID3D10EffectMatrixVariable_AsDepthStencilView(This) (This)->lpVtbl->AsDepthStencilView(This)
#define ID3D10EffectMatrixVariable_AsConstantBuffer(This) (This)->lpVtbl->AsConstantBuffer(This)
#define ID3D10EffectMatrixVariable_AsShader(This) (This)->lpVtbl->AsShader(This)
#define ID3D10EffectMatrixVariable_AsBlend(This) (This)->lpVtbl->AsBlend(This)
#define ID3D10EffectMatrixVariable_AsDepthStencil(This) (This)->lpVtbl->AsDepthStencil(This)
#define ID3D10EffectMatrixVariable_AsRasterizer(This) (This)->lpVtbl->AsRasterizer(This)
#define ID3D10EffectMatrixVariable_AsSampler(This) (This)->lpVtbl->AsSampler(This)
#define ID3D10EffectMatrixVariable_SetRawValue(This,data,offset,count) (This)->lpVtbl->SetRawValue(This,data,offset,count)
#define ID3D10EffectMatrixVariable_GetRawValue(This,data,offset,count) (This)->lpVtbl->GetRawValue(This,data,offset,count)
/*** ID3D10EffectMatrixVariable methods ***/
#define ID3D10EffectMatrixVariable_SetMatrix(This,data) (This)->lpVtbl->SetMatrix(This,data)
#define ID3D10EffectMatrixVariable_GetMatrix(This,data) (This)->lpVtbl->GetMatrix(This,data)
#define ID3D10EffectMatrixVariable_SetMatrixArray(This,data,offset,count) (This)->lpVtbl->SetMatrixArray(This,data,offset,count)
#define ID3D10EffectMatrixVariable_GetMatrixArray(This,data,offset,count) (This)->lpVtbl->GetMatrixArray(This,data,offset,count)
#define ID3D10EffectMatrixVariable_SetMatrixTranspose(This,data) (This)->lpVtbl->SetMatrixTranspose(This,data)
#define ID3D10EffectMatrixVariable_GetMatrixTranspose(This,data) (This)->lpVtbl->GetMatrixTranspose(This,data)
#define ID3D10EffectMatrixVariable_SetMatrixTransposeArray(This,data,offset,count) (This)->lpVtbl->SetMatrixTransposeArray(This,data,offset,count)
#define ID3D10EffectMatrixVariable_GetMatrixTransposeArray(This,data,offset,count) (This)->lpVtbl->GetMatrixTransposeArray(This,data,offset,count)
#else
/*** ID3D10EffectVariable methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectMatrixVariable_IsValid(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectMatrixVariable_GetType(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectMatrixVariable_GetDesc(ID3D10EffectMatrixVariable* This,D3D10_EFFECT_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectMatrixVariable_GetAnnotationByIndex(ID3D10EffectMatrixVariable* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectMatrixVariable_GetAnnotationByName(ID3D10EffectMatrixVariable* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectMatrixVariable_GetMemberByIndex(ID3D10EffectMatrixVariable* This,UINT index) {
    return This->lpVtbl->GetMemberByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectMatrixVariable_GetMemberByName(ID3D10EffectMatrixVariable* This,const char *name) {
    return This->lpVtbl->GetMemberByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectMatrixVariable_GetMemberBySemantic(ID3D10EffectMatrixVariable* This,const char *semantic) {
    return This->lpVtbl->GetMemberBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectMatrixVariable_GetElement(ID3D10EffectMatrixVariable* This,UINT index) {
    return This->lpVtbl->GetElement(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectMatrixVariable_GetParentConstantBuffer(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->GetParentConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectScalarVariable * ID3D10EffectMatrixVariable_AsScalar(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->AsScalar(This);
}
static __WIDL_INLINE ID3D10EffectVectorVariable * ID3D10EffectMatrixVariable_AsVector(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->AsVector(This);
}
static __WIDL_INLINE ID3D10EffectMatrixVariable * ID3D10EffectMatrixVariable_AsMatrix(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->AsMatrix(This);
}
static __WIDL_INLINE ID3D10EffectStringVariable * ID3D10EffectMatrixVariable_AsString(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->AsString(This);
}
static __WIDL_INLINE ID3D10EffectShaderResourceVariable * ID3D10EffectMatrixVariable_AsShaderResource(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->AsShaderResource(This);
}
static __WIDL_INLINE ID3D10EffectRenderTargetViewVariable * ID3D10EffectMatrixVariable_AsRenderTargetView(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->AsRenderTargetView(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilViewVariable * ID3D10EffectMatrixVariable_AsDepthStencilView(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->AsDepthStencilView(This);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectMatrixVariable_AsConstantBuffer(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->AsConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectShaderVariable * ID3D10EffectMatrixVariable_AsShader(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->AsShader(This);
}
static __WIDL_INLINE ID3D10EffectBlendVariable * ID3D10EffectMatrixVariable_AsBlend(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->AsBlend(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilVariable * ID3D10EffectMatrixVariable_AsDepthStencil(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->AsDepthStencil(This);
}
static __WIDL_INLINE ID3D10EffectRasterizerVariable * ID3D10EffectMatrixVariable_AsRasterizer(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->AsRasterizer(This);
}
static __WIDL_INLINE ID3D10EffectSamplerVariable * ID3D10EffectMatrixVariable_AsSampler(ID3D10EffectMatrixVariable* This) {
    return This->lpVtbl->AsSampler(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectMatrixVariable_SetRawValue(ID3D10EffectMatrixVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->SetRawValue(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectMatrixVariable_GetRawValue(ID3D10EffectMatrixVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->GetRawValue(This,data,offset,count);
}
/*** ID3D10EffectMatrixVariable methods ***/
static __WIDL_INLINE HRESULT ID3D10EffectMatrixVariable_SetMatrix(ID3D10EffectMatrixVariable* This,float *data) {
    return This->lpVtbl->SetMatrix(This,data);
}
static __WIDL_INLINE HRESULT ID3D10EffectMatrixVariable_GetMatrix(ID3D10EffectMatrixVariable* This,float *data) {
    return This->lpVtbl->GetMatrix(This,data);
}
static __WIDL_INLINE HRESULT ID3D10EffectMatrixVariable_SetMatrixArray(ID3D10EffectMatrixVariable* This,float *data,UINT offset,UINT count) {
    return This->lpVtbl->SetMatrixArray(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectMatrixVariable_GetMatrixArray(ID3D10EffectMatrixVariable* This,float *data,UINT offset,UINT count) {
    return This->lpVtbl->GetMatrixArray(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectMatrixVariable_SetMatrixTranspose(ID3D10EffectMatrixVariable* This,float *data) {
    return This->lpVtbl->SetMatrixTranspose(This,data);
}
static __WIDL_INLINE HRESULT ID3D10EffectMatrixVariable_GetMatrixTranspose(ID3D10EffectMatrixVariable* This,float *data) {
    return This->lpVtbl->GetMatrixTranspose(This,data);
}
static __WIDL_INLINE HRESULT ID3D10EffectMatrixVariable_SetMatrixTransposeArray(ID3D10EffectMatrixVariable* This,float *data,UINT offset,UINT count) {
    return This->lpVtbl->SetMatrixTransposeArray(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectMatrixVariable_GetMatrixTransposeArray(ID3D10EffectMatrixVariable* This,float *data,UINT offset,UINT count) {
    return This->lpVtbl->GetMatrixTransposeArray(This,data,offset,count);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectMatrixVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectStringVariable interface
 */
#ifndef __ID3D10EffectStringVariable_INTERFACE_DEFINED__
#define __ID3D10EffectStringVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectStringVariable, 0x71417501, 0x8df9, 0x4e0a, 0xa7,0x8a, 0x25,0x5f,0x97,0x56,0xba,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("71417501-8df9-4e0a-a78a-255f9756baff")
ID3D10EffectStringVariable : public ID3D10EffectVariable
{
    virtual HRESULT STDMETHODCALLTYPE GetString(
        const char **str) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetStringArray(
        const char **strs,
        UINT offset,
        UINT count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectStringVariable, 0x71417501, 0x8df9, 0x4e0a, 0xa7,0x8a, 0x25,0x5f,0x97,0x56,0xba,0xff)
#endif
#else
typedef struct ID3D10EffectStringVariableVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectVariable methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectStringVariable *This);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetType)(
        ID3D10EffectStringVariable *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectStringVariable *This,
        D3D10_EFFECT_VARIABLE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectStringVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectStringVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByIndex)(
        ID3D10EffectStringVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByName)(
        ID3D10EffectStringVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberBySemantic)(
        ID3D10EffectStringVariable *This,
        const char *semantic);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetElement)(
        ID3D10EffectStringVariable *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetParentConstantBuffer)(
        ID3D10EffectStringVariable *This);

    ID3D10EffectScalarVariable * (STDMETHODCALLTYPE *AsScalar)(
        ID3D10EffectStringVariable *This);

    ID3D10EffectVectorVariable * (STDMETHODCALLTYPE *AsVector)(
        ID3D10EffectStringVariable *This);

    ID3D10EffectMatrixVariable * (STDMETHODCALLTYPE *AsMatrix)(
        ID3D10EffectStringVariable *This);

    ID3D10EffectStringVariable * (STDMETHODCALLTYPE *AsString)(
        ID3D10EffectStringVariable *This);

    ID3D10EffectShaderResourceVariable * (STDMETHODCALLTYPE *AsShaderResource)(
        ID3D10EffectStringVariable *This);

    ID3D10EffectRenderTargetViewVariable * (STDMETHODCALLTYPE *AsRenderTargetView)(
        ID3D10EffectStringVariable *This);

    ID3D10EffectDepthStencilViewVariable * (STDMETHODCALLTYPE *AsDepthStencilView)(
        ID3D10EffectStringVariable *This);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *AsConstantBuffer)(
        ID3D10EffectStringVariable *This);

    ID3D10EffectShaderVariable * (STDMETHODCALLTYPE *AsShader)(
        ID3D10EffectStringVariable *This);

    ID3D10EffectBlendVariable * (STDMETHODCALLTYPE *AsBlend)(
        ID3D10EffectStringVariable *This);

    ID3D10EffectDepthStencilVariable * (STDMETHODCALLTYPE *AsDepthStencil)(
        ID3D10EffectStringVariable *This);

    ID3D10EffectRasterizerVariable * (STDMETHODCALLTYPE *AsRasterizer)(
        ID3D10EffectStringVariable *This);

    ID3D10EffectSamplerVariable * (STDMETHODCALLTYPE *AsSampler)(
        ID3D10EffectStringVariable *This);

    HRESULT (STDMETHODCALLTYPE *SetRawValue)(
        ID3D10EffectStringVariable *This,
        void *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRawValue)(
        ID3D10EffectStringVariable *This,
        void *data,
        UINT offset,
        UINT count);

    /*** ID3D10EffectStringVariable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetString)(
        ID3D10EffectStringVariable *This,
        const char **str);

    HRESULT (STDMETHODCALLTYPE *GetStringArray)(
        ID3D10EffectStringVariable *This,
        const char **strs,
        UINT offset,
        UINT count);

    END_INTERFACE
} ID3D10EffectStringVariableVtbl;

interface ID3D10EffectStringVariable {
    CONST_VTBL ID3D10EffectStringVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectVariable methods ***/
#define ID3D10EffectStringVariable_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectStringVariable_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D10EffectStringVariable_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectStringVariable_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectStringVariable_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectStringVariable_GetMemberByIndex(This,index) (This)->lpVtbl->GetMemberByIndex(This,index)
#define ID3D10EffectStringVariable_GetMemberByName(This,name) (This)->lpVtbl->GetMemberByName(This,name)
#define ID3D10EffectStringVariable_GetMemberBySemantic(This,semantic) (This)->lpVtbl->GetMemberBySemantic(This,semantic)
#define ID3D10EffectStringVariable_GetElement(This,index) (This)->lpVtbl->GetElement(This,index)
#define ID3D10EffectStringVariable_GetParentConstantBuffer(This) (This)->lpVtbl->GetParentConstantBuffer(This)
#define ID3D10EffectStringVariable_AsScalar(This) (This)->lpVtbl->AsScalar(This)
#define ID3D10EffectStringVariable_AsVector(This) (This)->lpVtbl->AsVector(This)
#define ID3D10EffectStringVariable_AsMatrix(This) (This)->lpVtbl->AsMatrix(This)
#define ID3D10EffectStringVariable_AsString(This) (This)->lpVtbl->AsString(This)
#define ID3D10EffectStringVariable_AsShaderResource(This) (This)->lpVtbl->AsShaderResource(This)
#define ID3D10EffectStringVariable_AsRenderTargetView(This) (This)->lpVtbl->AsRenderTargetView(This)
#define ID3D10EffectStringVariable_AsDepthStencilView(This) (This)->lpVtbl->AsDepthStencilView(This)
#define ID3D10EffectStringVariable_AsConstantBuffer(This) (This)->lpVtbl->AsConstantBuffer(This)
#define ID3D10EffectStringVariable_AsShader(This) (This)->lpVtbl->AsShader(This)
#define ID3D10EffectStringVariable_AsBlend(This) (This)->lpVtbl->AsBlend(This)
#define ID3D10EffectStringVariable_AsDepthStencil(This) (This)->lpVtbl->AsDepthStencil(This)
#define ID3D10EffectStringVariable_AsRasterizer(This) (This)->lpVtbl->AsRasterizer(This)
#define ID3D10EffectStringVariable_AsSampler(This) (This)->lpVtbl->AsSampler(This)
#define ID3D10EffectStringVariable_SetRawValue(This,data,offset,count) (This)->lpVtbl->SetRawValue(This,data,offset,count)
#define ID3D10EffectStringVariable_GetRawValue(This,data,offset,count) (This)->lpVtbl->GetRawValue(This,data,offset,count)
/*** ID3D10EffectStringVariable methods ***/
#define ID3D10EffectStringVariable_GetString(This,str) (This)->lpVtbl->GetString(This,str)
#define ID3D10EffectStringVariable_GetStringArray(This,strs,offset,count) (This)->lpVtbl->GetStringArray(This,strs,offset,count)
#else
/*** ID3D10EffectVariable methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectStringVariable_IsValid(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectStringVariable_GetType(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectStringVariable_GetDesc(ID3D10EffectStringVariable* This,D3D10_EFFECT_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectStringVariable_GetAnnotationByIndex(ID3D10EffectStringVariable* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectStringVariable_GetAnnotationByName(ID3D10EffectStringVariable* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectStringVariable_GetMemberByIndex(ID3D10EffectStringVariable* This,UINT index) {
    return This->lpVtbl->GetMemberByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectStringVariable_GetMemberByName(ID3D10EffectStringVariable* This,const char *name) {
    return This->lpVtbl->GetMemberByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectStringVariable_GetMemberBySemantic(ID3D10EffectStringVariable* This,const char *semantic) {
    return This->lpVtbl->GetMemberBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectStringVariable_GetElement(ID3D10EffectStringVariable* This,UINT index) {
    return This->lpVtbl->GetElement(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectStringVariable_GetParentConstantBuffer(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->GetParentConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectScalarVariable * ID3D10EffectStringVariable_AsScalar(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->AsScalar(This);
}
static __WIDL_INLINE ID3D10EffectVectorVariable * ID3D10EffectStringVariable_AsVector(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->AsVector(This);
}
static __WIDL_INLINE ID3D10EffectMatrixVariable * ID3D10EffectStringVariable_AsMatrix(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->AsMatrix(This);
}
static __WIDL_INLINE ID3D10EffectStringVariable * ID3D10EffectStringVariable_AsString(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->AsString(This);
}
static __WIDL_INLINE ID3D10EffectShaderResourceVariable * ID3D10EffectStringVariable_AsShaderResource(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->AsShaderResource(This);
}
static __WIDL_INLINE ID3D10EffectRenderTargetViewVariable * ID3D10EffectStringVariable_AsRenderTargetView(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->AsRenderTargetView(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilViewVariable * ID3D10EffectStringVariable_AsDepthStencilView(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->AsDepthStencilView(This);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectStringVariable_AsConstantBuffer(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->AsConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectShaderVariable * ID3D10EffectStringVariable_AsShader(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->AsShader(This);
}
static __WIDL_INLINE ID3D10EffectBlendVariable * ID3D10EffectStringVariable_AsBlend(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->AsBlend(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilVariable * ID3D10EffectStringVariable_AsDepthStencil(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->AsDepthStencil(This);
}
static __WIDL_INLINE ID3D10EffectRasterizerVariable * ID3D10EffectStringVariable_AsRasterizer(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->AsRasterizer(This);
}
static __WIDL_INLINE ID3D10EffectSamplerVariable * ID3D10EffectStringVariable_AsSampler(ID3D10EffectStringVariable* This) {
    return This->lpVtbl->AsSampler(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectStringVariable_SetRawValue(ID3D10EffectStringVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->SetRawValue(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectStringVariable_GetRawValue(ID3D10EffectStringVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->GetRawValue(This,data,offset,count);
}
/*** ID3D10EffectStringVariable methods ***/
static __WIDL_INLINE HRESULT ID3D10EffectStringVariable_GetString(ID3D10EffectStringVariable* This,const char **str) {
    return This->lpVtbl->GetString(This,str);
}
static __WIDL_INLINE HRESULT ID3D10EffectStringVariable_GetStringArray(ID3D10EffectStringVariable* This,const char **strs,UINT offset,UINT count) {
    return This->lpVtbl->GetStringArray(This,strs,offset,count);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectStringVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectShaderResourceVariable interface
 */
#ifndef __ID3D10EffectShaderResourceVariable_INTERFACE_DEFINED__
#define __ID3D10EffectShaderResourceVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectShaderResourceVariable, 0xc0a7157b, 0xd872, 0x4b1d, 0x80,0x73, 0xef,0xc2,0xac,0xd4,0xb1,0xfc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c0a7157b-d872-4b1d-8073-efc2acd4b1fc")
ID3D10EffectShaderResourceVariable : public ID3D10EffectVariable
{
    virtual HRESULT STDMETHODCALLTYPE SetResource(
        ID3D10ShaderResourceView *resource) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResource(
        ID3D10ShaderResourceView **resource) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetResourceArray(
        ID3D10ShaderResourceView **resources,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResourceArray(
        ID3D10ShaderResourceView **resources,
        UINT offset,
        UINT count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectShaderResourceVariable, 0xc0a7157b, 0xd872, 0x4b1d, 0x80,0x73, 0xef,0xc2,0xac,0xd4,0xb1,0xfc)
#endif
#else
typedef struct ID3D10EffectShaderResourceVariableVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectVariable methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectShaderResourceVariable *This);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetType)(
        ID3D10EffectShaderResourceVariable *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectShaderResourceVariable *This,
        D3D10_EFFECT_VARIABLE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectShaderResourceVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectShaderResourceVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByIndex)(
        ID3D10EffectShaderResourceVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByName)(
        ID3D10EffectShaderResourceVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberBySemantic)(
        ID3D10EffectShaderResourceVariable *This,
        const char *semantic);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetElement)(
        ID3D10EffectShaderResourceVariable *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetParentConstantBuffer)(
        ID3D10EffectShaderResourceVariable *This);

    ID3D10EffectScalarVariable * (STDMETHODCALLTYPE *AsScalar)(
        ID3D10EffectShaderResourceVariable *This);

    ID3D10EffectVectorVariable * (STDMETHODCALLTYPE *AsVector)(
        ID3D10EffectShaderResourceVariable *This);

    ID3D10EffectMatrixVariable * (STDMETHODCALLTYPE *AsMatrix)(
        ID3D10EffectShaderResourceVariable *This);

    ID3D10EffectStringVariable * (STDMETHODCALLTYPE *AsString)(
        ID3D10EffectShaderResourceVariable *This);

    ID3D10EffectShaderResourceVariable * (STDMETHODCALLTYPE *AsShaderResource)(
        ID3D10EffectShaderResourceVariable *This);

    ID3D10EffectRenderTargetViewVariable * (STDMETHODCALLTYPE *AsRenderTargetView)(
        ID3D10EffectShaderResourceVariable *This);

    ID3D10EffectDepthStencilViewVariable * (STDMETHODCALLTYPE *AsDepthStencilView)(
        ID3D10EffectShaderResourceVariable *This);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *AsConstantBuffer)(
        ID3D10EffectShaderResourceVariable *This);

    ID3D10EffectShaderVariable * (STDMETHODCALLTYPE *AsShader)(
        ID3D10EffectShaderResourceVariable *This);

    ID3D10EffectBlendVariable * (STDMETHODCALLTYPE *AsBlend)(
        ID3D10EffectShaderResourceVariable *This);

    ID3D10EffectDepthStencilVariable * (STDMETHODCALLTYPE *AsDepthStencil)(
        ID3D10EffectShaderResourceVariable *This);

    ID3D10EffectRasterizerVariable * (STDMETHODCALLTYPE *AsRasterizer)(
        ID3D10EffectShaderResourceVariable *This);

    ID3D10EffectSamplerVariable * (STDMETHODCALLTYPE *AsSampler)(
        ID3D10EffectShaderResourceVariable *This);

    HRESULT (STDMETHODCALLTYPE *SetRawValue)(
        ID3D10EffectShaderResourceVariable *This,
        void *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRawValue)(
        ID3D10EffectShaderResourceVariable *This,
        void *data,
        UINT offset,
        UINT count);

    /*** ID3D10EffectShaderResourceVariable methods ***/
    HRESULT (STDMETHODCALLTYPE *SetResource)(
        ID3D10EffectShaderResourceVariable *This,
        ID3D10ShaderResourceView *resource);

    HRESULT (STDMETHODCALLTYPE *GetResource)(
        ID3D10EffectShaderResourceVariable *This,
        ID3D10ShaderResourceView **resource);

    HRESULT (STDMETHODCALLTYPE *SetResourceArray)(
        ID3D10EffectShaderResourceVariable *This,
        ID3D10ShaderResourceView **resources,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetResourceArray)(
        ID3D10EffectShaderResourceVariable *This,
        ID3D10ShaderResourceView **resources,
        UINT offset,
        UINT count);

    END_INTERFACE
} ID3D10EffectShaderResourceVariableVtbl;

interface ID3D10EffectShaderResourceVariable {
    CONST_VTBL ID3D10EffectShaderResourceVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectVariable methods ***/
#define ID3D10EffectShaderResourceVariable_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectShaderResourceVariable_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D10EffectShaderResourceVariable_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectShaderResourceVariable_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectShaderResourceVariable_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectShaderResourceVariable_GetMemberByIndex(This,index) (This)->lpVtbl->GetMemberByIndex(This,index)
#define ID3D10EffectShaderResourceVariable_GetMemberByName(This,name) (This)->lpVtbl->GetMemberByName(This,name)
#define ID3D10EffectShaderResourceVariable_GetMemberBySemantic(This,semantic) (This)->lpVtbl->GetMemberBySemantic(This,semantic)
#define ID3D10EffectShaderResourceVariable_GetElement(This,index) (This)->lpVtbl->GetElement(This,index)
#define ID3D10EffectShaderResourceVariable_GetParentConstantBuffer(This) (This)->lpVtbl->GetParentConstantBuffer(This)
#define ID3D10EffectShaderResourceVariable_AsScalar(This) (This)->lpVtbl->AsScalar(This)
#define ID3D10EffectShaderResourceVariable_AsVector(This) (This)->lpVtbl->AsVector(This)
#define ID3D10EffectShaderResourceVariable_AsMatrix(This) (This)->lpVtbl->AsMatrix(This)
#define ID3D10EffectShaderResourceVariable_AsString(This) (This)->lpVtbl->AsString(This)
#define ID3D10EffectShaderResourceVariable_AsShaderResource(This) (This)->lpVtbl->AsShaderResource(This)
#define ID3D10EffectShaderResourceVariable_AsRenderTargetView(This) (This)->lpVtbl->AsRenderTargetView(This)
#define ID3D10EffectShaderResourceVariable_AsDepthStencilView(This) (This)->lpVtbl->AsDepthStencilView(This)
#define ID3D10EffectShaderResourceVariable_AsConstantBuffer(This) (This)->lpVtbl->AsConstantBuffer(This)
#define ID3D10EffectShaderResourceVariable_AsShader(This) (This)->lpVtbl->AsShader(This)
#define ID3D10EffectShaderResourceVariable_AsBlend(This) (This)->lpVtbl->AsBlend(This)
#define ID3D10EffectShaderResourceVariable_AsDepthStencil(This) (This)->lpVtbl->AsDepthStencil(This)
#define ID3D10EffectShaderResourceVariable_AsRasterizer(This) (This)->lpVtbl->AsRasterizer(This)
#define ID3D10EffectShaderResourceVariable_AsSampler(This) (This)->lpVtbl->AsSampler(This)
#define ID3D10EffectShaderResourceVariable_SetRawValue(This,data,offset,count) (This)->lpVtbl->SetRawValue(This,data,offset,count)
#define ID3D10EffectShaderResourceVariable_GetRawValue(This,data,offset,count) (This)->lpVtbl->GetRawValue(This,data,offset,count)
/*** ID3D10EffectShaderResourceVariable methods ***/
#define ID3D10EffectShaderResourceVariable_SetResource(This,resource) (This)->lpVtbl->SetResource(This,resource)
#define ID3D10EffectShaderResourceVariable_GetResource(This,resource) (This)->lpVtbl->GetResource(This,resource)
#define ID3D10EffectShaderResourceVariable_SetResourceArray(This,resources,offset,count) (This)->lpVtbl->SetResourceArray(This,resources,offset,count)
#define ID3D10EffectShaderResourceVariable_GetResourceArray(This,resources,offset,count) (This)->lpVtbl->GetResourceArray(This,resources,offset,count)
#else
/*** ID3D10EffectVariable methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectShaderResourceVariable_IsValid(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectShaderResourceVariable_GetType(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectShaderResourceVariable_GetDesc(ID3D10EffectShaderResourceVariable* This,D3D10_EFFECT_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectShaderResourceVariable_GetAnnotationByIndex(ID3D10EffectShaderResourceVariable* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectShaderResourceVariable_GetAnnotationByName(ID3D10EffectShaderResourceVariable* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectShaderResourceVariable_GetMemberByIndex(ID3D10EffectShaderResourceVariable* This,UINT index) {
    return This->lpVtbl->GetMemberByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectShaderResourceVariable_GetMemberByName(ID3D10EffectShaderResourceVariable* This,const char *name) {
    return This->lpVtbl->GetMemberByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectShaderResourceVariable_GetMemberBySemantic(ID3D10EffectShaderResourceVariable* This,const char *semantic) {
    return This->lpVtbl->GetMemberBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectShaderResourceVariable_GetElement(ID3D10EffectShaderResourceVariable* This,UINT index) {
    return This->lpVtbl->GetElement(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectShaderResourceVariable_GetParentConstantBuffer(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->GetParentConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectScalarVariable * ID3D10EffectShaderResourceVariable_AsScalar(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->AsScalar(This);
}
static __WIDL_INLINE ID3D10EffectVectorVariable * ID3D10EffectShaderResourceVariable_AsVector(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->AsVector(This);
}
static __WIDL_INLINE ID3D10EffectMatrixVariable * ID3D10EffectShaderResourceVariable_AsMatrix(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->AsMatrix(This);
}
static __WIDL_INLINE ID3D10EffectStringVariable * ID3D10EffectShaderResourceVariable_AsString(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->AsString(This);
}
static __WIDL_INLINE ID3D10EffectShaderResourceVariable * ID3D10EffectShaderResourceVariable_AsShaderResource(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->AsShaderResource(This);
}
static __WIDL_INLINE ID3D10EffectRenderTargetViewVariable * ID3D10EffectShaderResourceVariable_AsRenderTargetView(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->AsRenderTargetView(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilViewVariable * ID3D10EffectShaderResourceVariable_AsDepthStencilView(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->AsDepthStencilView(This);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectShaderResourceVariable_AsConstantBuffer(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->AsConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectShaderVariable * ID3D10EffectShaderResourceVariable_AsShader(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->AsShader(This);
}
static __WIDL_INLINE ID3D10EffectBlendVariable * ID3D10EffectShaderResourceVariable_AsBlend(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->AsBlend(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilVariable * ID3D10EffectShaderResourceVariable_AsDepthStencil(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->AsDepthStencil(This);
}
static __WIDL_INLINE ID3D10EffectRasterizerVariable * ID3D10EffectShaderResourceVariable_AsRasterizer(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->AsRasterizer(This);
}
static __WIDL_INLINE ID3D10EffectSamplerVariable * ID3D10EffectShaderResourceVariable_AsSampler(ID3D10EffectShaderResourceVariable* This) {
    return This->lpVtbl->AsSampler(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectShaderResourceVariable_SetRawValue(ID3D10EffectShaderResourceVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->SetRawValue(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectShaderResourceVariable_GetRawValue(ID3D10EffectShaderResourceVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->GetRawValue(This,data,offset,count);
}
/*** ID3D10EffectShaderResourceVariable methods ***/
static __WIDL_INLINE HRESULT ID3D10EffectShaderResourceVariable_SetResource(ID3D10EffectShaderResourceVariable* This,ID3D10ShaderResourceView *resource) {
    return This->lpVtbl->SetResource(This,resource);
}
static __WIDL_INLINE HRESULT ID3D10EffectShaderResourceVariable_GetResource(ID3D10EffectShaderResourceVariable* This,ID3D10ShaderResourceView **resource) {
    return This->lpVtbl->GetResource(This,resource);
}
static __WIDL_INLINE HRESULT ID3D10EffectShaderResourceVariable_SetResourceArray(ID3D10EffectShaderResourceVariable* This,ID3D10ShaderResourceView **resources,UINT offset,UINT count) {
    return This->lpVtbl->SetResourceArray(This,resources,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectShaderResourceVariable_GetResourceArray(ID3D10EffectShaderResourceVariable* This,ID3D10ShaderResourceView **resources,UINT offset,UINT count) {
    return This->lpVtbl->GetResourceArray(This,resources,offset,count);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectShaderResourceVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectRenderTargetViewVariable interface
 */
#ifndef __ID3D10EffectRenderTargetViewVariable_INTERFACE_DEFINED__
#define __ID3D10EffectRenderTargetViewVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectRenderTargetViewVariable, 0x28ca0cc3, 0xc2c9, 0x40bb, 0xb5,0x7f, 0x67,0xb7,0x37,0x12,0x2b,0x17);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("28ca0cc3-c2c9-40bb-b57f-67b737122b17")
ID3D10EffectRenderTargetViewVariable : public ID3D10EffectVariable
{
    virtual HRESULT STDMETHODCALLTYPE SetRenderTarget(
        ID3D10RenderTargetView *view) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRenderTarget(
        ID3D10RenderTargetView **view) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRenderTargetArray(
        ID3D10RenderTargetView **views,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetRenderTargetArray(
        ID3D10RenderTargetView **views,
        UINT offset,
        UINT count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectRenderTargetViewVariable, 0x28ca0cc3, 0xc2c9, 0x40bb, 0xb5,0x7f, 0x67,0xb7,0x37,0x12,0x2b,0x17)
#endif
#else
typedef struct ID3D10EffectRenderTargetViewVariableVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectVariable methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectRenderTargetViewVariable *This);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetType)(
        ID3D10EffectRenderTargetViewVariable *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectRenderTargetViewVariable *This,
        D3D10_EFFECT_VARIABLE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectRenderTargetViewVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectRenderTargetViewVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByIndex)(
        ID3D10EffectRenderTargetViewVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByName)(
        ID3D10EffectRenderTargetViewVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberBySemantic)(
        ID3D10EffectRenderTargetViewVariable *This,
        const char *semantic);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetElement)(
        ID3D10EffectRenderTargetViewVariable *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetParentConstantBuffer)(
        ID3D10EffectRenderTargetViewVariable *This);

    ID3D10EffectScalarVariable * (STDMETHODCALLTYPE *AsScalar)(
        ID3D10EffectRenderTargetViewVariable *This);

    ID3D10EffectVectorVariable * (STDMETHODCALLTYPE *AsVector)(
        ID3D10EffectRenderTargetViewVariable *This);

    ID3D10EffectMatrixVariable * (STDMETHODCALLTYPE *AsMatrix)(
        ID3D10EffectRenderTargetViewVariable *This);

    ID3D10EffectStringVariable * (STDMETHODCALLTYPE *AsString)(
        ID3D10EffectRenderTargetViewVariable *This);

    ID3D10EffectShaderResourceVariable * (STDMETHODCALLTYPE *AsShaderResource)(
        ID3D10EffectRenderTargetViewVariable *This);

    ID3D10EffectRenderTargetViewVariable * (STDMETHODCALLTYPE *AsRenderTargetView)(
        ID3D10EffectRenderTargetViewVariable *This);

    ID3D10EffectDepthStencilViewVariable * (STDMETHODCALLTYPE *AsDepthStencilView)(
        ID3D10EffectRenderTargetViewVariable *This);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *AsConstantBuffer)(
        ID3D10EffectRenderTargetViewVariable *This);

    ID3D10EffectShaderVariable * (STDMETHODCALLTYPE *AsShader)(
        ID3D10EffectRenderTargetViewVariable *This);

    ID3D10EffectBlendVariable * (STDMETHODCALLTYPE *AsBlend)(
        ID3D10EffectRenderTargetViewVariable *This);

    ID3D10EffectDepthStencilVariable * (STDMETHODCALLTYPE *AsDepthStencil)(
        ID3D10EffectRenderTargetViewVariable *This);

    ID3D10EffectRasterizerVariable * (STDMETHODCALLTYPE *AsRasterizer)(
        ID3D10EffectRenderTargetViewVariable *This);

    ID3D10EffectSamplerVariable * (STDMETHODCALLTYPE *AsSampler)(
        ID3D10EffectRenderTargetViewVariable *This);

    HRESULT (STDMETHODCALLTYPE *SetRawValue)(
        ID3D10EffectRenderTargetViewVariable *This,
        void *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRawValue)(
        ID3D10EffectRenderTargetViewVariable *This,
        void *data,
        UINT offset,
        UINT count);

    /*** ID3D10EffectRenderTargetViewVariable methods ***/
    HRESULT (STDMETHODCALLTYPE *SetRenderTarget)(
        ID3D10EffectRenderTargetViewVariable *This,
        ID3D10RenderTargetView *view);

    HRESULT (STDMETHODCALLTYPE *GetRenderTarget)(
        ID3D10EffectRenderTargetViewVariable *This,
        ID3D10RenderTargetView **view);

    HRESULT (STDMETHODCALLTYPE *SetRenderTargetArray)(
        ID3D10EffectRenderTargetViewVariable *This,
        ID3D10RenderTargetView **views,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRenderTargetArray)(
        ID3D10EffectRenderTargetViewVariable *This,
        ID3D10RenderTargetView **views,
        UINT offset,
        UINT count);

    END_INTERFACE
} ID3D10EffectRenderTargetViewVariableVtbl;

interface ID3D10EffectRenderTargetViewVariable {
    CONST_VTBL ID3D10EffectRenderTargetViewVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectVariable methods ***/
#define ID3D10EffectRenderTargetViewVariable_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectRenderTargetViewVariable_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D10EffectRenderTargetViewVariable_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectRenderTargetViewVariable_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectRenderTargetViewVariable_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectRenderTargetViewVariable_GetMemberByIndex(This,index) (This)->lpVtbl->GetMemberByIndex(This,index)
#define ID3D10EffectRenderTargetViewVariable_GetMemberByName(This,name) (This)->lpVtbl->GetMemberByName(This,name)
#define ID3D10EffectRenderTargetViewVariable_GetMemberBySemantic(This,semantic) (This)->lpVtbl->GetMemberBySemantic(This,semantic)
#define ID3D10EffectRenderTargetViewVariable_GetElement(This,index) (This)->lpVtbl->GetElement(This,index)
#define ID3D10EffectRenderTargetViewVariable_GetParentConstantBuffer(This) (This)->lpVtbl->GetParentConstantBuffer(This)
#define ID3D10EffectRenderTargetViewVariable_AsScalar(This) (This)->lpVtbl->AsScalar(This)
#define ID3D10EffectRenderTargetViewVariable_AsVector(This) (This)->lpVtbl->AsVector(This)
#define ID3D10EffectRenderTargetViewVariable_AsMatrix(This) (This)->lpVtbl->AsMatrix(This)
#define ID3D10EffectRenderTargetViewVariable_AsString(This) (This)->lpVtbl->AsString(This)
#define ID3D10EffectRenderTargetViewVariable_AsShaderResource(This) (This)->lpVtbl->AsShaderResource(This)
#define ID3D10EffectRenderTargetViewVariable_AsRenderTargetView(This) (This)->lpVtbl->AsRenderTargetView(This)
#define ID3D10EffectRenderTargetViewVariable_AsDepthStencilView(This) (This)->lpVtbl->AsDepthStencilView(This)
#define ID3D10EffectRenderTargetViewVariable_AsConstantBuffer(This) (This)->lpVtbl->AsConstantBuffer(This)
#define ID3D10EffectRenderTargetViewVariable_AsShader(This) (This)->lpVtbl->AsShader(This)
#define ID3D10EffectRenderTargetViewVariable_AsBlend(This) (This)->lpVtbl->AsBlend(This)
#define ID3D10EffectRenderTargetViewVariable_AsDepthStencil(This) (This)->lpVtbl->AsDepthStencil(This)
#define ID3D10EffectRenderTargetViewVariable_AsRasterizer(This) (This)->lpVtbl->AsRasterizer(This)
#define ID3D10EffectRenderTargetViewVariable_AsSampler(This) (This)->lpVtbl->AsSampler(This)
#define ID3D10EffectRenderTargetViewVariable_SetRawValue(This,data,offset,count) (This)->lpVtbl->SetRawValue(This,data,offset,count)
#define ID3D10EffectRenderTargetViewVariable_GetRawValue(This,data,offset,count) (This)->lpVtbl->GetRawValue(This,data,offset,count)
/*** ID3D10EffectRenderTargetViewVariable methods ***/
#define ID3D10EffectRenderTargetViewVariable_SetRenderTarget(This,view) (This)->lpVtbl->SetRenderTarget(This,view)
#define ID3D10EffectRenderTargetViewVariable_GetRenderTarget(This,view) (This)->lpVtbl->GetRenderTarget(This,view)
#define ID3D10EffectRenderTargetViewVariable_SetRenderTargetArray(This,views,offset,count) (This)->lpVtbl->SetRenderTargetArray(This,views,offset,count)
#define ID3D10EffectRenderTargetViewVariable_GetRenderTargetArray(This,views,offset,count) (This)->lpVtbl->GetRenderTargetArray(This,views,offset,count)
#else
/*** ID3D10EffectVariable methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectRenderTargetViewVariable_IsValid(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectRenderTargetViewVariable_GetType(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectRenderTargetViewVariable_GetDesc(ID3D10EffectRenderTargetViewVariable* This,D3D10_EFFECT_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectRenderTargetViewVariable_GetAnnotationByIndex(ID3D10EffectRenderTargetViewVariable* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectRenderTargetViewVariable_GetAnnotationByName(ID3D10EffectRenderTargetViewVariable* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectRenderTargetViewVariable_GetMemberByIndex(ID3D10EffectRenderTargetViewVariable* This,UINT index) {
    return This->lpVtbl->GetMemberByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectRenderTargetViewVariable_GetMemberByName(ID3D10EffectRenderTargetViewVariable* This,const char *name) {
    return This->lpVtbl->GetMemberByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectRenderTargetViewVariable_GetMemberBySemantic(ID3D10EffectRenderTargetViewVariable* This,const char *semantic) {
    return This->lpVtbl->GetMemberBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectRenderTargetViewVariable_GetElement(ID3D10EffectRenderTargetViewVariable* This,UINT index) {
    return This->lpVtbl->GetElement(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectRenderTargetViewVariable_GetParentConstantBuffer(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->GetParentConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectScalarVariable * ID3D10EffectRenderTargetViewVariable_AsScalar(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->AsScalar(This);
}
static __WIDL_INLINE ID3D10EffectVectorVariable * ID3D10EffectRenderTargetViewVariable_AsVector(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->AsVector(This);
}
static __WIDL_INLINE ID3D10EffectMatrixVariable * ID3D10EffectRenderTargetViewVariable_AsMatrix(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->AsMatrix(This);
}
static __WIDL_INLINE ID3D10EffectStringVariable * ID3D10EffectRenderTargetViewVariable_AsString(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->AsString(This);
}
static __WIDL_INLINE ID3D10EffectShaderResourceVariable * ID3D10EffectRenderTargetViewVariable_AsShaderResource(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->AsShaderResource(This);
}
static __WIDL_INLINE ID3D10EffectRenderTargetViewVariable * ID3D10EffectRenderTargetViewVariable_AsRenderTargetView(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->AsRenderTargetView(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilViewVariable * ID3D10EffectRenderTargetViewVariable_AsDepthStencilView(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->AsDepthStencilView(This);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectRenderTargetViewVariable_AsConstantBuffer(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->AsConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectShaderVariable * ID3D10EffectRenderTargetViewVariable_AsShader(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->AsShader(This);
}
static __WIDL_INLINE ID3D10EffectBlendVariable * ID3D10EffectRenderTargetViewVariable_AsBlend(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->AsBlend(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilVariable * ID3D10EffectRenderTargetViewVariable_AsDepthStencil(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->AsDepthStencil(This);
}
static __WIDL_INLINE ID3D10EffectRasterizerVariable * ID3D10EffectRenderTargetViewVariable_AsRasterizer(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->AsRasterizer(This);
}
static __WIDL_INLINE ID3D10EffectSamplerVariable * ID3D10EffectRenderTargetViewVariable_AsSampler(ID3D10EffectRenderTargetViewVariable* This) {
    return This->lpVtbl->AsSampler(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectRenderTargetViewVariable_SetRawValue(ID3D10EffectRenderTargetViewVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->SetRawValue(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectRenderTargetViewVariable_GetRawValue(ID3D10EffectRenderTargetViewVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->GetRawValue(This,data,offset,count);
}
/*** ID3D10EffectRenderTargetViewVariable methods ***/
static __WIDL_INLINE HRESULT ID3D10EffectRenderTargetViewVariable_SetRenderTarget(ID3D10EffectRenderTargetViewVariable* This,ID3D10RenderTargetView *view) {
    return This->lpVtbl->SetRenderTarget(This,view);
}
static __WIDL_INLINE HRESULT ID3D10EffectRenderTargetViewVariable_GetRenderTarget(ID3D10EffectRenderTargetViewVariable* This,ID3D10RenderTargetView **view) {
    return This->lpVtbl->GetRenderTarget(This,view);
}
static __WIDL_INLINE HRESULT ID3D10EffectRenderTargetViewVariable_SetRenderTargetArray(ID3D10EffectRenderTargetViewVariable* This,ID3D10RenderTargetView **views,UINT offset,UINT count) {
    return This->lpVtbl->SetRenderTargetArray(This,views,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectRenderTargetViewVariable_GetRenderTargetArray(ID3D10EffectRenderTargetViewVariable* This,ID3D10RenderTargetView **views,UINT offset,UINT count) {
    return This->lpVtbl->GetRenderTargetArray(This,views,offset,count);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectRenderTargetViewVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectDepthStencilViewVariable interface
 */
#ifndef __ID3D10EffectDepthStencilViewVariable_INTERFACE_DEFINED__
#define __ID3D10EffectDepthStencilViewVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectDepthStencilViewVariable, 0x3e02c918, 0xcc79, 0x4985, 0xb6,0x22, 0x2d,0x92,0xad,0x70,0x16,0x23);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3e02c918-cc79-4985-b622-2d92ad701623")
ID3D10EffectDepthStencilViewVariable : public ID3D10EffectVariable
{
    virtual HRESULT STDMETHODCALLTYPE SetDepthStencil(
        ID3D10DepthStencilView *view) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDepthStencil(
        ID3D10DepthStencilView **view) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetDepthStencilArray(
        ID3D10DepthStencilView **views,
        UINT offset,
        UINT count) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDepthStencilArray(
        ID3D10DepthStencilView **views,
        UINT offset,
        UINT count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectDepthStencilViewVariable, 0x3e02c918, 0xcc79, 0x4985, 0xb6,0x22, 0x2d,0x92,0xad,0x70,0x16,0x23)
#endif
#else
typedef struct ID3D10EffectDepthStencilViewVariableVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectVariable methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectDepthStencilViewVariable *This);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetType)(
        ID3D10EffectDepthStencilViewVariable *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectDepthStencilViewVariable *This,
        D3D10_EFFECT_VARIABLE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectDepthStencilViewVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectDepthStencilViewVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByIndex)(
        ID3D10EffectDepthStencilViewVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByName)(
        ID3D10EffectDepthStencilViewVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberBySemantic)(
        ID3D10EffectDepthStencilViewVariable *This,
        const char *semantic);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetElement)(
        ID3D10EffectDepthStencilViewVariable *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetParentConstantBuffer)(
        ID3D10EffectDepthStencilViewVariable *This);

    ID3D10EffectScalarVariable * (STDMETHODCALLTYPE *AsScalar)(
        ID3D10EffectDepthStencilViewVariable *This);

    ID3D10EffectVectorVariable * (STDMETHODCALLTYPE *AsVector)(
        ID3D10EffectDepthStencilViewVariable *This);

    ID3D10EffectMatrixVariable * (STDMETHODCALLTYPE *AsMatrix)(
        ID3D10EffectDepthStencilViewVariable *This);

    ID3D10EffectStringVariable * (STDMETHODCALLTYPE *AsString)(
        ID3D10EffectDepthStencilViewVariable *This);

    ID3D10EffectShaderResourceVariable * (STDMETHODCALLTYPE *AsShaderResource)(
        ID3D10EffectDepthStencilViewVariable *This);

    ID3D10EffectRenderTargetViewVariable * (STDMETHODCALLTYPE *AsRenderTargetView)(
        ID3D10EffectDepthStencilViewVariable *This);

    ID3D10EffectDepthStencilViewVariable * (STDMETHODCALLTYPE *AsDepthStencilView)(
        ID3D10EffectDepthStencilViewVariable *This);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *AsConstantBuffer)(
        ID3D10EffectDepthStencilViewVariable *This);

    ID3D10EffectShaderVariable * (STDMETHODCALLTYPE *AsShader)(
        ID3D10EffectDepthStencilViewVariable *This);

    ID3D10EffectBlendVariable * (STDMETHODCALLTYPE *AsBlend)(
        ID3D10EffectDepthStencilViewVariable *This);

    ID3D10EffectDepthStencilVariable * (STDMETHODCALLTYPE *AsDepthStencil)(
        ID3D10EffectDepthStencilViewVariable *This);

    ID3D10EffectRasterizerVariable * (STDMETHODCALLTYPE *AsRasterizer)(
        ID3D10EffectDepthStencilViewVariable *This);

    ID3D10EffectSamplerVariable * (STDMETHODCALLTYPE *AsSampler)(
        ID3D10EffectDepthStencilViewVariable *This);

    HRESULT (STDMETHODCALLTYPE *SetRawValue)(
        ID3D10EffectDepthStencilViewVariable *This,
        void *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRawValue)(
        ID3D10EffectDepthStencilViewVariable *This,
        void *data,
        UINT offset,
        UINT count);

    /*** ID3D10EffectDepthStencilViewVariable methods ***/
    HRESULT (STDMETHODCALLTYPE *SetDepthStencil)(
        ID3D10EffectDepthStencilViewVariable *This,
        ID3D10DepthStencilView *view);

    HRESULT (STDMETHODCALLTYPE *GetDepthStencil)(
        ID3D10EffectDepthStencilViewVariable *This,
        ID3D10DepthStencilView **view);

    HRESULT (STDMETHODCALLTYPE *SetDepthStencilArray)(
        ID3D10EffectDepthStencilViewVariable *This,
        ID3D10DepthStencilView **views,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetDepthStencilArray)(
        ID3D10EffectDepthStencilViewVariable *This,
        ID3D10DepthStencilView **views,
        UINT offset,
        UINT count);

    END_INTERFACE
} ID3D10EffectDepthStencilViewVariableVtbl;

interface ID3D10EffectDepthStencilViewVariable {
    CONST_VTBL ID3D10EffectDepthStencilViewVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectVariable methods ***/
#define ID3D10EffectDepthStencilViewVariable_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectDepthStencilViewVariable_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D10EffectDepthStencilViewVariable_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectDepthStencilViewVariable_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectDepthStencilViewVariable_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectDepthStencilViewVariable_GetMemberByIndex(This,index) (This)->lpVtbl->GetMemberByIndex(This,index)
#define ID3D10EffectDepthStencilViewVariable_GetMemberByName(This,name) (This)->lpVtbl->GetMemberByName(This,name)
#define ID3D10EffectDepthStencilViewVariable_GetMemberBySemantic(This,semantic) (This)->lpVtbl->GetMemberBySemantic(This,semantic)
#define ID3D10EffectDepthStencilViewVariable_GetElement(This,index) (This)->lpVtbl->GetElement(This,index)
#define ID3D10EffectDepthStencilViewVariable_GetParentConstantBuffer(This) (This)->lpVtbl->GetParentConstantBuffer(This)
#define ID3D10EffectDepthStencilViewVariable_AsScalar(This) (This)->lpVtbl->AsScalar(This)
#define ID3D10EffectDepthStencilViewVariable_AsVector(This) (This)->lpVtbl->AsVector(This)
#define ID3D10EffectDepthStencilViewVariable_AsMatrix(This) (This)->lpVtbl->AsMatrix(This)
#define ID3D10EffectDepthStencilViewVariable_AsString(This) (This)->lpVtbl->AsString(This)
#define ID3D10EffectDepthStencilViewVariable_AsShaderResource(This) (This)->lpVtbl->AsShaderResource(This)
#define ID3D10EffectDepthStencilViewVariable_AsRenderTargetView(This) (This)->lpVtbl->AsRenderTargetView(This)
#define ID3D10EffectDepthStencilViewVariable_AsDepthStencilView(This) (This)->lpVtbl->AsDepthStencilView(This)
#define ID3D10EffectDepthStencilViewVariable_AsConstantBuffer(This) (This)->lpVtbl->AsConstantBuffer(This)
#define ID3D10EffectDepthStencilViewVariable_AsShader(This) (This)->lpVtbl->AsShader(This)
#define ID3D10EffectDepthStencilViewVariable_AsBlend(This) (This)->lpVtbl->AsBlend(This)
#define ID3D10EffectDepthStencilViewVariable_AsDepthStencil(This) (This)->lpVtbl->AsDepthStencil(This)
#define ID3D10EffectDepthStencilViewVariable_AsRasterizer(This) (This)->lpVtbl->AsRasterizer(This)
#define ID3D10EffectDepthStencilViewVariable_AsSampler(This) (This)->lpVtbl->AsSampler(This)
#define ID3D10EffectDepthStencilViewVariable_SetRawValue(This,data,offset,count) (This)->lpVtbl->SetRawValue(This,data,offset,count)
#define ID3D10EffectDepthStencilViewVariable_GetRawValue(This,data,offset,count) (This)->lpVtbl->GetRawValue(This,data,offset,count)
/*** ID3D10EffectDepthStencilViewVariable methods ***/
#define ID3D10EffectDepthStencilViewVariable_SetDepthStencil(This,view) (This)->lpVtbl->SetDepthStencil(This,view)
#define ID3D10EffectDepthStencilViewVariable_GetDepthStencil(This,view) (This)->lpVtbl->GetDepthStencil(This,view)
#define ID3D10EffectDepthStencilViewVariable_SetDepthStencilArray(This,views,offset,count) (This)->lpVtbl->SetDepthStencilArray(This,views,offset,count)
#define ID3D10EffectDepthStencilViewVariable_GetDepthStencilArray(This,views,offset,count) (This)->lpVtbl->GetDepthStencilArray(This,views,offset,count)
#else
/*** ID3D10EffectVariable methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectDepthStencilViewVariable_IsValid(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectDepthStencilViewVariable_GetType(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectDepthStencilViewVariable_GetDesc(ID3D10EffectDepthStencilViewVariable* This,D3D10_EFFECT_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectDepthStencilViewVariable_GetAnnotationByIndex(ID3D10EffectDepthStencilViewVariable* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectDepthStencilViewVariable_GetAnnotationByName(ID3D10EffectDepthStencilViewVariable* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectDepthStencilViewVariable_GetMemberByIndex(ID3D10EffectDepthStencilViewVariable* This,UINT index) {
    return This->lpVtbl->GetMemberByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectDepthStencilViewVariable_GetMemberByName(ID3D10EffectDepthStencilViewVariable* This,const char *name) {
    return This->lpVtbl->GetMemberByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectDepthStencilViewVariable_GetMemberBySemantic(ID3D10EffectDepthStencilViewVariable* This,const char *semantic) {
    return This->lpVtbl->GetMemberBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectDepthStencilViewVariable_GetElement(ID3D10EffectDepthStencilViewVariable* This,UINT index) {
    return This->lpVtbl->GetElement(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectDepthStencilViewVariable_GetParentConstantBuffer(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->GetParentConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectScalarVariable * ID3D10EffectDepthStencilViewVariable_AsScalar(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->AsScalar(This);
}
static __WIDL_INLINE ID3D10EffectVectorVariable * ID3D10EffectDepthStencilViewVariable_AsVector(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->AsVector(This);
}
static __WIDL_INLINE ID3D10EffectMatrixVariable * ID3D10EffectDepthStencilViewVariable_AsMatrix(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->AsMatrix(This);
}
static __WIDL_INLINE ID3D10EffectStringVariable * ID3D10EffectDepthStencilViewVariable_AsString(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->AsString(This);
}
static __WIDL_INLINE ID3D10EffectShaderResourceVariable * ID3D10EffectDepthStencilViewVariable_AsShaderResource(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->AsShaderResource(This);
}
static __WIDL_INLINE ID3D10EffectRenderTargetViewVariable * ID3D10EffectDepthStencilViewVariable_AsRenderTargetView(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->AsRenderTargetView(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilViewVariable * ID3D10EffectDepthStencilViewVariable_AsDepthStencilView(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->AsDepthStencilView(This);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectDepthStencilViewVariable_AsConstantBuffer(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->AsConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectShaderVariable * ID3D10EffectDepthStencilViewVariable_AsShader(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->AsShader(This);
}
static __WIDL_INLINE ID3D10EffectBlendVariable * ID3D10EffectDepthStencilViewVariable_AsBlend(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->AsBlend(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilVariable * ID3D10EffectDepthStencilViewVariable_AsDepthStencil(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->AsDepthStencil(This);
}
static __WIDL_INLINE ID3D10EffectRasterizerVariable * ID3D10EffectDepthStencilViewVariable_AsRasterizer(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->AsRasterizer(This);
}
static __WIDL_INLINE ID3D10EffectSamplerVariable * ID3D10EffectDepthStencilViewVariable_AsSampler(ID3D10EffectDepthStencilViewVariable* This) {
    return This->lpVtbl->AsSampler(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectDepthStencilViewVariable_SetRawValue(ID3D10EffectDepthStencilViewVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->SetRawValue(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectDepthStencilViewVariable_GetRawValue(ID3D10EffectDepthStencilViewVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->GetRawValue(This,data,offset,count);
}
/*** ID3D10EffectDepthStencilViewVariable methods ***/
static __WIDL_INLINE HRESULT ID3D10EffectDepthStencilViewVariable_SetDepthStencil(ID3D10EffectDepthStencilViewVariable* This,ID3D10DepthStencilView *view) {
    return This->lpVtbl->SetDepthStencil(This,view);
}
static __WIDL_INLINE HRESULT ID3D10EffectDepthStencilViewVariable_GetDepthStencil(ID3D10EffectDepthStencilViewVariable* This,ID3D10DepthStencilView **view) {
    return This->lpVtbl->GetDepthStencil(This,view);
}
static __WIDL_INLINE HRESULT ID3D10EffectDepthStencilViewVariable_SetDepthStencilArray(ID3D10EffectDepthStencilViewVariable* This,ID3D10DepthStencilView **views,UINT offset,UINT count) {
    return This->lpVtbl->SetDepthStencilArray(This,views,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectDepthStencilViewVariable_GetDepthStencilArray(ID3D10EffectDepthStencilViewVariable* This,ID3D10DepthStencilView **views,UINT offset,UINT count) {
    return This->lpVtbl->GetDepthStencilArray(This,views,offset,count);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectDepthStencilViewVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectShaderVariable interface
 */
#ifndef __ID3D10EffectShaderVariable_INTERFACE_DEFINED__
#define __ID3D10EffectShaderVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectShaderVariable, 0x80849279, 0xc799, 0x4797, 0x8c,0x33, 0x04,0x07,0xa0,0x7d,0x9e,0x06);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("80849279-c799-4797-8c33-0407a07d9e06")
ID3D10EffectShaderVariable : public ID3D10EffectVariable
{
    virtual HRESULT STDMETHODCALLTYPE GetShaderDesc(
        UINT index,
        D3D10_EFFECT_SHADER_DESC *desc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVertexShader(
        UINT index,
        ID3D10VertexShader **shader) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGeometryShader(
        UINT index,
        ID3D10GeometryShader **shader) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPixelShader(
        UINT index,
        ID3D10PixelShader **shader) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetInputSignatureElementDesc(
        UINT shader_index,
        UINT element_index,
        D3D10_SIGNATURE_PARAMETER_DESC *desc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetOutputSignatureElementDesc(
        UINT shader_index,
        UINT element_index,
        D3D10_SIGNATURE_PARAMETER_DESC *desc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectShaderVariable, 0x80849279, 0xc799, 0x4797, 0x8c,0x33, 0x04,0x07,0xa0,0x7d,0x9e,0x06)
#endif
#else
typedef struct ID3D10EffectShaderVariableVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectVariable methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectShaderVariable *This);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetType)(
        ID3D10EffectShaderVariable *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectShaderVariable *This,
        D3D10_EFFECT_VARIABLE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectShaderVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectShaderVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByIndex)(
        ID3D10EffectShaderVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByName)(
        ID3D10EffectShaderVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberBySemantic)(
        ID3D10EffectShaderVariable *This,
        const char *semantic);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetElement)(
        ID3D10EffectShaderVariable *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetParentConstantBuffer)(
        ID3D10EffectShaderVariable *This);

    ID3D10EffectScalarVariable * (STDMETHODCALLTYPE *AsScalar)(
        ID3D10EffectShaderVariable *This);

    ID3D10EffectVectorVariable * (STDMETHODCALLTYPE *AsVector)(
        ID3D10EffectShaderVariable *This);

    ID3D10EffectMatrixVariable * (STDMETHODCALLTYPE *AsMatrix)(
        ID3D10EffectShaderVariable *This);

    ID3D10EffectStringVariable * (STDMETHODCALLTYPE *AsString)(
        ID3D10EffectShaderVariable *This);

    ID3D10EffectShaderResourceVariable * (STDMETHODCALLTYPE *AsShaderResource)(
        ID3D10EffectShaderVariable *This);

    ID3D10EffectRenderTargetViewVariable * (STDMETHODCALLTYPE *AsRenderTargetView)(
        ID3D10EffectShaderVariable *This);

    ID3D10EffectDepthStencilViewVariable * (STDMETHODCALLTYPE *AsDepthStencilView)(
        ID3D10EffectShaderVariable *This);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *AsConstantBuffer)(
        ID3D10EffectShaderVariable *This);

    ID3D10EffectShaderVariable * (STDMETHODCALLTYPE *AsShader)(
        ID3D10EffectShaderVariable *This);

    ID3D10EffectBlendVariable * (STDMETHODCALLTYPE *AsBlend)(
        ID3D10EffectShaderVariable *This);

    ID3D10EffectDepthStencilVariable * (STDMETHODCALLTYPE *AsDepthStencil)(
        ID3D10EffectShaderVariable *This);

    ID3D10EffectRasterizerVariable * (STDMETHODCALLTYPE *AsRasterizer)(
        ID3D10EffectShaderVariable *This);

    ID3D10EffectSamplerVariable * (STDMETHODCALLTYPE *AsSampler)(
        ID3D10EffectShaderVariable *This);

    HRESULT (STDMETHODCALLTYPE *SetRawValue)(
        ID3D10EffectShaderVariable *This,
        void *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRawValue)(
        ID3D10EffectShaderVariable *This,
        void *data,
        UINT offset,
        UINT count);

    /*** ID3D10EffectShaderVariable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetShaderDesc)(
        ID3D10EffectShaderVariable *This,
        UINT index,
        D3D10_EFFECT_SHADER_DESC *desc);

    HRESULT (STDMETHODCALLTYPE *GetVertexShader)(
        ID3D10EffectShaderVariable *This,
        UINT index,
        ID3D10VertexShader **shader);

    HRESULT (STDMETHODCALLTYPE *GetGeometryShader)(
        ID3D10EffectShaderVariable *This,
        UINT index,
        ID3D10GeometryShader **shader);

    HRESULT (STDMETHODCALLTYPE *GetPixelShader)(
        ID3D10EffectShaderVariable *This,
        UINT index,
        ID3D10PixelShader **shader);

    HRESULT (STDMETHODCALLTYPE *GetInputSignatureElementDesc)(
        ID3D10EffectShaderVariable *This,
        UINT shader_index,
        UINT element_index,
        D3D10_SIGNATURE_PARAMETER_DESC *desc);

    HRESULT (STDMETHODCALLTYPE *GetOutputSignatureElementDesc)(
        ID3D10EffectShaderVariable *This,
        UINT shader_index,
        UINT element_index,
        D3D10_SIGNATURE_PARAMETER_DESC *desc);

    END_INTERFACE
} ID3D10EffectShaderVariableVtbl;

interface ID3D10EffectShaderVariable {
    CONST_VTBL ID3D10EffectShaderVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectVariable methods ***/
#define ID3D10EffectShaderVariable_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectShaderVariable_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D10EffectShaderVariable_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectShaderVariable_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectShaderVariable_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectShaderVariable_GetMemberByIndex(This,index) (This)->lpVtbl->GetMemberByIndex(This,index)
#define ID3D10EffectShaderVariable_GetMemberByName(This,name) (This)->lpVtbl->GetMemberByName(This,name)
#define ID3D10EffectShaderVariable_GetMemberBySemantic(This,semantic) (This)->lpVtbl->GetMemberBySemantic(This,semantic)
#define ID3D10EffectShaderVariable_GetElement(This,index) (This)->lpVtbl->GetElement(This,index)
#define ID3D10EffectShaderVariable_GetParentConstantBuffer(This) (This)->lpVtbl->GetParentConstantBuffer(This)
#define ID3D10EffectShaderVariable_AsScalar(This) (This)->lpVtbl->AsScalar(This)
#define ID3D10EffectShaderVariable_AsVector(This) (This)->lpVtbl->AsVector(This)
#define ID3D10EffectShaderVariable_AsMatrix(This) (This)->lpVtbl->AsMatrix(This)
#define ID3D10EffectShaderVariable_AsString(This) (This)->lpVtbl->AsString(This)
#define ID3D10EffectShaderVariable_AsShaderResource(This) (This)->lpVtbl->AsShaderResource(This)
#define ID3D10EffectShaderVariable_AsRenderTargetView(This) (This)->lpVtbl->AsRenderTargetView(This)
#define ID3D10EffectShaderVariable_AsDepthStencilView(This) (This)->lpVtbl->AsDepthStencilView(This)
#define ID3D10EffectShaderVariable_AsConstantBuffer(This) (This)->lpVtbl->AsConstantBuffer(This)
#define ID3D10EffectShaderVariable_AsShader(This) (This)->lpVtbl->AsShader(This)
#define ID3D10EffectShaderVariable_AsBlend(This) (This)->lpVtbl->AsBlend(This)
#define ID3D10EffectShaderVariable_AsDepthStencil(This) (This)->lpVtbl->AsDepthStencil(This)
#define ID3D10EffectShaderVariable_AsRasterizer(This) (This)->lpVtbl->AsRasterizer(This)
#define ID3D10EffectShaderVariable_AsSampler(This) (This)->lpVtbl->AsSampler(This)
#define ID3D10EffectShaderVariable_SetRawValue(This,data,offset,count) (This)->lpVtbl->SetRawValue(This,data,offset,count)
#define ID3D10EffectShaderVariable_GetRawValue(This,data,offset,count) (This)->lpVtbl->GetRawValue(This,data,offset,count)
/*** ID3D10EffectShaderVariable methods ***/
#define ID3D10EffectShaderVariable_GetShaderDesc(This,index,desc) (This)->lpVtbl->GetShaderDesc(This,index,desc)
#define ID3D10EffectShaderVariable_GetVertexShader(This,index,shader) (This)->lpVtbl->GetVertexShader(This,index,shader)
#define ID3D10EffectShaderVariable_GetGeometryShader(This,index,shader) (This)->lpVtbl->GetGeometryShader(This,index,shader)
#define ID3D10EffectShaderVariable_GetPixelShader(This,index,shader) (This)->lpVtbl->GetPixelShader(This,index,shader)
#define ID3D10EffectShaderVariable_GetInputSignatureElementDesc(This,shader_index,element_index,desc) (This)->lpVtbl->GetInputSignatureElementDesc(This,shader_index,element_index,desc)
#define ID3D10EffectShaderVariable_GetOutputSignatureElementDesc(This,shader_index,element_index,desc) (This)->lpVtbl->GetOutputSignatureElementDesc(This,shader_index,element_index,desc)
#else
/*** ID3D10EffectVariable methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectShaderVariable_IsValid(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectShaderVariable_GetType(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectShaderVariable_GetDesc(ID3D10EffectShaderVariable* This,D3D10_EFFECT_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectShaderVariable_GetAnnotationByIndex(ID3D10EffectShaderVariable* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectShaderVariable_GetAnnotationByName(ID3D10EffectShaderVariable* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectShaderVariable_GetMemberByIndex(ID3D10EffectShaderVariable* This,UINT index) {
    return This->lpVtbl->GetMemberByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectShaderVariable_GetMemberByName(ID3D10EffectShaderVariable* This,const char *name) {
    return This->lpVtbl->GetMemberByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectShaderVariable_GetMemberBySemantic(ID3D10EffectShaderVariable* This,const char *semantic) {
    return This->lpVtbl->GetMemberBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectShaderVariable_GetElement(ID3D10EffectShaderVariable* This,UINT index) {
    return This->lpVtbl->GetElement(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectShaderVariable_GetParentConstantBuffer(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->GetParentConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectScalarVariable * ID3D10EffectShaderVariable_AsScalar(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->AsScalar(This);
}
static __WIDL_INLINE ID3D10EffectVectorVariable * ID3D10EffectShaderVariable_AsVector(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->AsVector(This);
}
static __WIDL_INLINE ID3D10EffectMatrixVariable * ID3D10EffectShaderVariable_AsMatrix(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->AsMatrix(This);
}
static __WIDL_INLINE ID3D10EffectStringVariable * ID3D10EffectShaderVariable_AsString(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->AsString(This);
}
static __WIDL_INLINE ID3D10EffectShaderResourceVariable * ID3D10EffectShaderVariable_AsShaderResource(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->AsShaderResource(This);
}
static __WIDL_INLINE ID3D10EffectRenderTargetViewVariable * ID3D10EffectShaderVariable_AsRenderTargetView(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->AsRenderTargetView(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilViewVariable * ID3D10EffectShaderVariable_AsDepthStencilView(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->AsDepthStencilView(This);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectShaderVariable_AsConstantBuffer(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->AsConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectShaderVariable * ID3D10EffectShaderVariable_AsShader(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->AsShader(This);
}
static __WIDL_INLINE ID3D10EffectBlendVariable * ID3D10EffectShaderVariable_AsBlend(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->AsBlend(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilVariable * ID3D10EffectShaderVariable_AsDepthStencil(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->AsDepthStencil(This);
}
static __WIDL_INLINE ID3D10EffectRasterizerVariable * ID3D10EffectShaderVariable_AsRasterizer(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->AsRasterizer(This);
}
static __WIDL_INLINE ID3D10EffectSamplerVariable * ID3D10EffectShaderVariable_AsSampler(ID3D10EffectShaderVariable* This) {
    return This->lpVtbl->AsSampler(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectShaderVariable_SetRawValue(ID3D10EffectShaderVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->SetRawValue(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectShaderVariable_GetRawValue(ID3D10EffectShaderVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->GetRawValue(This,data,offset,count);
}
/*** ID3D10EffectShaderVariable methods ***/
static __WIDL_INLINE HRESULT ID3D10EffectShaderVariable_GetShaderDesc(ID3D10EffectShaderVariable* This,UINT index,D3D10_EFFECT_SHADER_DESC *desc) {
    return This->lpVtbl->GetShaderDesc(This,index,desc);
}
static __WIDL_INLINE HRESULT ID3D10EffectShaderVariable_GetVertexShader(ID3D10EffectShaderVariable* This,UINT index,ID3D10VertexShader **shader) {
    return This->lpVtbl->GetVertexShader(This,index,shader);
}
static __WIDL_INLINE HRESULT ID3D10EffectShaderVariable_GetGeometryShader(ID3D10EffectShaderVariable* This,UINT index,ID3D10GeometryShader **shader) {
    return This->lpVtbl->GetGeometryShader(This,index,shader);
}
static __WIDL_INLINE HRESULT ID3D10EffectShaderVariable_GetPixelShader(ID3D10EffectShaderVariable* This,UINT index,ID3D10PixelShader **shader) {
    return This->lpVtbl->GetPixelShader(This,index,shader);
}
static __WIDL_INLINE HRESULT ID3D10EffectShaderVariable_GetInputSignatureElementDesc(ID3D10EffectShaderVariable* This,UINT shader_index,UINT element_index,D3D10_SIGNATURE_PARAMETER_DESC *desc) {
    return This->lpVtbl->GetInputSignatureElementDesc(This,shader_index,element_index,desc);
}
static __WIDL_INLINE HRESULT ID3D10EffectShaderVariable_GetOutputSignatureElementDesc(ID3D10EffectShaderVariable* This,UINT shader_index,UINT element_index,D3D10_SIGNATURE_PARAMETER_DESC *desc) {
    return This->lpVtbl->GetOutputSignatureElementDesc(This,shader_index,element_index,desc);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectShaderVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectBlendVariable interface
 */
#ifndef __ID3D10EffectBlendVariable_INTERFACE_DEFINED__
#define __ID3D10EffectBlendVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectBlendVariable, 0x1fcd2294, 0xdf6d, 0x4eae, 0x86,0xb3, 0x0e,0x91,0x60,0xcf,0xb0,0x7b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1fcd2294-df6d-4eae-86b3-0e9160cfb07b")
ID3D10EffectBlendVariable : public ID3D10EffectVariable
{
    virtual HRESULT STDMETHODCALLTYPE GetBlendState(
        UINT index,
        ID3D10BlendState **blend_state) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBackingStore(
        UINT index,
        D3D10_BLEND_DESC *desc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectBlendVariable, 0x1fcd2294, 0xdf6d, 0x4eae, 0x86,0xb3, 0x0e,0x91,0x60,0xcf,0xb0,0x7b)
#endif
#else
typedef struct ID3D10EffectBlendVariableVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectVariable methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectBlendVariable *This);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetType)(
        ID3D10EffectBlendVariable *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectBlendVariable *This,
        D3D10_EFFECT_VARIABLE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectBlendVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectBlendVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByIndex)(
        ID3D10EffectBlendVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByName)(
        ID3D10EffectBlendVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberBySemantic)(
        ID3D10EffectBlendVariable *This,
        const char *semantic);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetElement)(
        ID3D10EffectBlendVariable *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetParentConstantBuffer)(
        ID3D10EffectBlendVariable *This);

    ID3D10EffectScalarVariable * (STDMETHODCALLTYPE *AsScalar)(
        ID3D10EffectBlendVariable *This);

    ID3D10EffectVectorVariable * (STDMETHODCALLTYPE *AsVector)(
        ID3D10EffectBlendVariable *This);

    ID3D10EffectMatrixVariable * (STDMETHODCALLTYPE *AsMatrix)(
        ID3D10EffectBlendVariable *This);

    ID3D10EffectStringVariable * (STDMETHODCALLTYPE *AsString)(
        ID3D10EffectBlendVariable *This);

    ID3D10EffectShaderResourceVariable * (STDMETHODCALLTYPE *AsShaderResource)(
        ID3D10EffectBlendVariable *This);

    ID3D10EffectRenderTargetViewVariable * (STDMETHODCALLTYPE *AsRenderTargetView)(
        ID3D10EffectBlendVariable *This);

    ID3D10EffectDepthStencilViewVariable * (STDMETHODCALLTYPE *AsDepthStencilView)(
        ID3D10EffectBlendVariable *This);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *AsConstantBuffer)(
        ID3D10EffectBlendVariable *This);

    ID3D10EffectShaderVariable * (STDMETHODCALLTYPE *AsShader)(
        ID3D10EffectBlendVariable *This);

    ID3D10EffectBlendVariable * (STDMETHODCALLTYPE *AsBlend)(
        ID3D10EffectBlendVariable *This);

    ID3D10EffectDepthStencilVariable * (STDMETHODCALLTYPE *AsDepthStencil)(
        ID3D10EffectBlendVariable *This);

    ID3D10EffectRasterizerVariable * (STDMETHODCALLTYPE *AsRasterizer)(
        ID3D10EffectBlendVariable *This);

    ID3D10EffectSamplerVariable * (STDMETHODCALLTYPE *AsSampler)(
        ID3D10EffectBlendVariable *This);

    HRESULT (STDMETHODCALLTYPE *SetRawValue)(
        ID3D10EffectBlendVariable *This,
        void *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRawValue)(
        ID3D10EffectBlendVariable *This,
        void *data,
        UINT offset,
        UINT count);

    /*** ID3D10EffectBlendVariable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetBlendState)(
        ID3D10EffectBlendVariable *This,
        UINT index,
        ID3D10BlendState **blend_state);

    HRESULT (STDMETHODCALLTYPE *GetBackingStore)(
        ID3D10EffectBlendVariable *This,
        UINT index,
        D3D10_BLEND_DESC *desc);

    END_INTERFACE
} ID3D10EffectBlendVariableVtbl;

interface ID3D10EffectBlendVariable {
    CONST_VTBL ID3D10EffectBlendVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectVariable methods ***/
#define ID3D10EffectBlendVariable_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectBlendVariable_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D10EffectBlendVariable_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectBlendVariable_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectBlendVariable_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectBlendVariable_GetMemberByIndex(This,index) (This)->lpVtbl->GetMemberByIndex(This,index)
#define ID3D10EffectBlendVariable_GetMemberByName(This,name) (This)->lpVtbl->GetMemberByName(This,name)
#define ID3D10EffectBlendVariable_GetMemberBySemantic(This,semantic) (This)->lpVtbl->GetMemberBySemantic(This,semantic)
#define ID3D10EffectBlendVariable_GetElement(This,index) (This)->lpVtbl->GetElement(This,index)
#define ID3D10EffectBlendVariable_GetParentConstantBuffer(This) (This)->lpVtbl->GetParentConstantBuffer(This)
#define ID3D10EffectBlendVariable_AsScalar(This) (This)->lpVtbl->AsScalar(This)
#define ID3D10EffectBlendVariable_AsVector(This) (This)->lpVtbl->AsVector(This)
#define ID3D10EffectBlendVariable_AsMatrix(This) (This)->lpVtbl->AsMatrix(This)
#define ID3D10EffectBlendVariable_AsString(This) (This)->lpVtbl->AsString(This)
#define ID3D10EffectBlendVariable_AsShaderResource(This) (This)->lpVtbl->AsShaderResource(This)
#define ID3D10EffectBlendVariable_AsRenderTargetView(This) (This)->lpVtbl->AsRenderTargetView(This)
#define ID3D10EffectBlendVariable_AsDepthStencilView(This) (This)->lpVtbl->AsDepthStencilView(This)
#define ID3D10EffectBlendVariable_AsConstantBuffer(This) (This)->lpVtbl->AsConstantBuffer(This)
#define ID3D10EffectBlendVariable_AsShader(This) (This)->lpVtbl->AsShader(This)
#define ID3D10EffectBlendVariable_AsBlend(This) (This)->lpVtbl->AsBlend(This)
#define ID3D10EffectBlendVariable_AsDepthStencil(This) (This)->lpVtbl->AsDepthStencil(This)
#define ID3D10EffectBlendVariable_AsRasterizer(This) (This)->lpVtbl->AsRasterizer(This)
#define ID3D10EffectBlendVariable_AsSampler(This) (This)->lpVtbl->AsSampler(This)
#define ID3D10EffectBlendVariable_SetRawValue(This,data,offset,count) (This)->lpVtbl->SetRawValue(This,data,offset,count)
#define ID3D10EffectBlendVariable_GetRawValue(This,data,offset,count) (This)->lpVtbl->GetRawValue(This,data,offset,count)
/*** ID3D10EffectBlendVariable methods ***/
#define ID3D10EffectBlendVariable_GetBlendState(This,index,blend_state) (This)->lpVtbl->GetBlendState(This,index,blend_state)
#define ID3D10EffectBlendVariable_GetBackingStore(This,index,desc) (This)->lpVtbl->GetBackingStore(This,index,desc)
#else
/*** ID3D10EffectVariable methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectBlendVariable_IsValid(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectBlendVariable_GetType(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectBlendVariable_GetDesc(ID3D10EffectBlendVariable* This,D3D10_EFFECT_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectBlendVariable_GetAnnotationByIndex(ID3D10EffectBlendVariable* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectBlendVariable_GetAnnotationByName(ID3D10EffectBlendVariable* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectBlendVariable_GetMemberByIndex(ID3D10EffectBlendVariable* This,UINT index) {
    return This->lpVtbl->GetMemberByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectBlendVariable_GetMemberByName(ID3D10EffectBlendVariable* This,const char *name) {
    return This->lpVtbl->GetMemberByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectBlendVariable_GetMemberBySemantic(ID3D10EffectBlendVariable* This,const char *semantic) {
    return This->lpVtbl->GetMemberBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectBlendVariable_GetElement(ID3D10EffectBlendVariable* This,UINT index) {
    return This->lpVtbl->GetElement(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectBlendVariable_GetParentConstantBuffer(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->GetParentConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectScalarVariable * ID3D10EffectBlendVariable_AsScalar(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->AsScalar(This);
}
static __WIDL_INLINE ID3D10EffectVectorVariable * ID3D10EffectBlendVariable_AsVector(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->AsVector(This);
}
static __WIDL_INLINE ID3D10EffectMatrixVariable * ID3D10EffectBlendVariable_AsMatrix(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->AsMatrix(This);
}
static __WIDL_INLINE ID3D10EffectStringVariable * ID3D10EffectBlendVariable_AsString(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->AsString(This);
}
static __WIDL_INLINE ID3D10EffectShaderResourceVariable * ID3D10EffectBlendVariable_AsShaderResource(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->AsShaderResource(This);
}
static __WIDL_INLINE ID3D10EffectRenderTargetViewVariable * ID3D10EffectBlendVariable_AsRenderTargetView(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->AsRenderTargetView(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilViewVariable * ID3D10EffectBlendVariable_AsDepthStencilView(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->AsDepthStencilView(This);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectBlendVariable_AsConstantBuffer(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->AsConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectShaderVariable * ID3D10EffectBlendVariable_AsShader(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->AsShader(This);
}
static __WIDL_INLINE ID3D10EffectBlendVariable * ID3D10EffectBlendVariable_AsBlend(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->AsBlend(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilVariable * ID3D10EffectBlendVariable_AsDepthStencil(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->AsDepthStencil(This);
}
static __WIDL_INLINE ID3D10EffectRasterizerVariable * ID3D10EffectBlendVariable_AsRasterizer(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->AsRasterizer(This);
}
static __WIDL_INLINE ID3D10EffectSamplerVariable * ID3D10EffectBlendVariable_AsSampler(ID3D10EffectBlendVariable* This) {
    return This->lpVtbl->AsSampler(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectBlendVariable_SetRawValue(ID3D10EffectBlendVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->SetRawValue(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectBlendVariable_GetRawValue(ID3D10EffectBlendVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->GetRawValue(This,data,offset,count);
}
/*** ID3D10EffectBlendVariable methods ***/
static __WIDL_INLINE HRESULT ID3D10EffectBlendVariable_GetBlendState(ID3D10EffectBlendVariable* This,UINT index,ID3D10BlendState **blend_state) {
    return This->lpVtbl->GetBlendState(This,index,blend_state);
}
static __WIDL_INLINE HRESULT ID3D10EffectBlendVariable_GetBackingStore(ID3D10EffectBlendVariable* This,UINT index,D3D10_BLEND_DESC *desc) {
    return This->lpVtbl->GetBackingStore(This,index,desc);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectBlendVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectDepthStencilVariable interface
 */
#ifndef __ID3D10EffectDepthStencilVariable_INTERFACE_DEFINED__
#define __ID3D10EffectDepthStencilVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectDepthStencilVariable, 0xaf482368, 0x330a, 0x46a5, 0x9a,0x5c, 0x01,0xc7,0x1a,0xf2,0x4c,0x8d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("af482368-330a-46a5-9a5c-01c71af24c8d")
ID3D10EffectDepthStencilVariable : public ID3D10EffectVariable
{
    virtual HRESULT STDMETHODCALLTYPE GetDepthStencilState(
        UINT index,
        ID3D10DepthStencilState **depth_stencil_state) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBackingStore(
        UINT index,
        D3D10_DEPTH_STENCIL_DESC *desc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectDepthStencilVariable, 0xaf482368, 0x330a, 0x46a5, 0x9a,0x5c, 0x01,0xc7,0x1a,0xf2,0x4c,0x8d)
#endif
#else
typedef struct ID3D10EffectDepthStencilVariableVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectVariable methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectDepthStencilVariable *This);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetType)(
        ID3D10EffectDepthStencilVariable *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectDepthStencilVariable *This,
        D3D10_EFFECT_VARIABLE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectDepthStencilVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectDepthStencilVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByIndex)(
        ID3D10EffectDepthStencilVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByName)(
        ID3D10EffectDepthStencilVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberBySemantic)(
        ID3D10EffectDepthStencilVariable *This,
        const char *semantic);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetElement)(
        ID3D10EffectDepthStencilVariable *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetParentConstantBuffer)(
        ID3D10EffectDepthStencilVariable *This);

    ID3D10EffectScalarVariable * (STDMETHODCALLTYPE *AsScalar)(
        ID3D10EffectDepthStencilVariable *This);

    ID3D10EffectVectorVariable * (STDMETHODCALLTYPE *AsVector)(
        ID3D10EffectDepthStencilVariable *This);

    ID3D10EffectMatrixVariable * (STDMETHODCALLTYPE *AsMatrix)(
        ID3D10EffectDepthStencilVariable *This);

    ID3D10EffectStringVariable * (STDMETHODCALLTYPE *AsString)(
        ID3D10EffectDepthStencilVariable *This);

    ID3D10EffectShaderResourceVariable * (STDMETHODCALLTYPE *AsShaderResource)(
        ID3D10EffectDepthStencilVariable *This);

    ID3D10EffectRenderTargetViewVariable * (STDMETHODCALLTYPE *AsRenderTargetView)(
        ID3D10EffectDepthStencilVariable *This);

    ID3D10EffectDepthStencilViewVariable * (STDMETHODCALLTYPE *AsDepthStencilView)(
        ID3D10EffectDepthStencilVariable *This);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *AsConstantBuffer)(
        ID3D10EffectDepthStencilVariable *This);

    ID3D10EffectShaderVariable * (STDMETHODCALLTYPE *AsShader)(
        ID3D10EffectDepthStencilVariable *This);

    ID3D10EffectBlendVariable * (STDMETHODCALLTYPE *AsBlend)(
        ID3D10EffectDepthStencilVariable *This);

    ID3D10EffectDepthStencilVariable * (STDMETHODCALLTYPE *AsDepthStencil)(
        ID3D10EffectDepthStencilVariable *This);

    ID3D10EffectRasterizerVariable * (STDMETHODCALLTYPE *AsRasterizer)(
        ID3D10EffectDepthStencilVariable *This);

    ID3D10EffectSamplerVariable * (STDMETHODCALLTYPE *AsSampler)(
        ID3D10EffectDepthStencilVariable *This);

    HRESULT (STDMETHODCALLTYPE *SetRawValue)(
        ID3D10EffectDepthStencilVariable *This,
        void *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRawValue)(
        ID3D10EffectDepthStencilVariable *This,
        void *data,
        UINT offset,
        UINT count);

    /*** ID3D10EffectDepthStencilVariable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetDepthStencilState)(
        ID3D10EffectDepthStencilVariable *This,
        UINT index,
        ID3D10DepthStencilState **depth_stencil_state);

    HRESULT (STDMETHODCALLTYPE *GetBackingStore)(
        ID3D10EffectDepthStencilVariable *This,
        UINT index,
        D3D10_DEPTH_STENCIL_DESC *desc);

    END_INTERFACE
} ID3D10EffectDepthStencilVariableVtbl;

interface ID3D10EffectDepthStencilVariable {
    CONST_VTBL ID3D10EffectDepthStencilVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectVariable methods ***/
#define ID3D10EffectDepthStencilVariable_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectDepthStencilVariable_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D10EffectDepthStencilVariable_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectDepthStencilVariable_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectDepthStencilVariable_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectDepthStencilVariable_GetMemberByIndex(This,index) (This)->lpVtbl->GetMemberByIndex(This,index)
#define ID3D10EffectDepthStencilVariable_GetMemberByName(This,name) (This)->lpVtbl->GetMemberByName(This,name)
#define ID3D10EffectDepthStencilVariable_GetMemberBySemantic(This,semantic) (This)->lpVtbl->GetMemberBySemantic(This,semantic)
#define ID3D10EffectDepthStencilVariable_GetElement(This,index) (This)->lpVtbl->GetElement(This,index)
#define ID3D10EffectDepthStencilVariable_GetParentConstantBuffer(This) (This)->lpVtbl->GetParentConstantBuffer(This)
#define ID3D10EffectDepthStencilVariable_AsScalar(This) (This)->lpVtbl->AsScalar(This)
#define ID3D10EffectDepthStencilVariable_AsVector(This) (This)->lpVtbl->AsVector(This)
#define ID3D10EffectDepthStencilVariable_AsMatrix(This) (This)->lpVtbl->AsMatrix(This)
#define ID3D10EffectDepthStencilVariable_AsString(This) (This)->lpVtbl->AsString(This)
#define ID3D10EffectDepthStencilVariable_AsShaderResource(This) (This)->lpVtbl->AsShaderResource(This)
#define ID3D10EffectDepthStencilVariable_AsRenderTargetView(This) (This)->lpVtbl->AsRenderTargetView(This)
#define ID3D10EffectDepthStencilVariable_AsDepthStencilView(This) (This)->lpVtbl->AsDepthStencilView(This)
#define ID3D10EffectDepthStencilVariable_AsConstantBuffer(This) (This)->lpVtbl->AsConstantBuffer(This)
#define ID3D10EffectDepthStencilVariable_AsShader(This) (This)->lpVtbl->AsShader(This)
#define ID3D10EffectDepthStencilVariable_AsBlend(This) (This)->lpVtbl->AsBlend(This)
#define ID3D10EffectDepthStencilVariable_AsDepthStencil(This) (This)->lpVtbl->AsDepthStencil(This)
#define ID3D10EffectDepthStencilVariable_AsRasterizer(This) (This)->lpVtbl->AsRasterizer(This)
#define ID3D10EffectDepthStencilVariable_AsSampler(This) (This)->lpVtbl->AsSampler(This)
#define ID3D10EffectDepthStencilVariable_SetRawValue(This,data,offset,count) (This)->lpVtbl->SetRawValue(This,data,offset,count)
#define ID3D10EffectDepthStencilVariable_GetRawValue(This,data,offset,count) (This)->lpVtbl->GetRawValue(This,data,offset,count)
/*** ID3D10EffectDepthStencilVariable methods ***/
#define ID3D10EffectDepthStencilVariable_GetDepthStencilState(This,index,depth_stencil_state) (This)->lpVtbl->GetDepthStencilState(This,index,depth_stencil_state)
#define ID3D10EffectDepthStencilVariable_GetBackingStore(This,index,desc) (This)->lpVtbl->GetBackingStore(This,index,desc)
#else
/*** ID3D10EffectVariable methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectDepthStencilVariable_IsValid(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectDepthStencilVariable_GetType(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectDepthStencilVariable_GetDesc(ID3D10EffectDepthStencilVariable* This,D3D10_EFFECT_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectDepthStencilVariable_GetAnnotationByIndex(ID3D10EffectDepthStencilVariable* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectDepthStencilVariable_GetAnnotationByName(ID3D10EffectDepthStencilVariable* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectDepthStencilVariable_GetMemberByIndex(ID3D10EffectDepthStencilVariable* This,UINT index) {
    return This->lpVtbl->GetMemberByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectDepthStencilVariable_GetMemberByName(ID3D10EffectDepthStencilVariable* This,const char *name) {
    return This->lpVtbl->GetMemberByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectDepthStencilVariable_GetMemberBySemantic(ID3D10EffectDepthStencilVariable* This,const char *semantic) {
    return This->lpVtbl->GetMemberBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectDepthStencilVariable_GetElement(ID3D10EffectDepthStencilVariable* This,UINT index) {
    return This->lpVtbl->GetElement(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectDepthStencilVariable_GetParentConstantBuffer(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->GetParentConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectScalarVariable * ID3D10EffectDepthStencilVariable_AsScalar(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->AsScalar(This);
}
static __WIDL_INLINE ID3D10EffectVectorVariable * ID3D10EffectDepthStencilVariable_AsVector(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->AsVector(This);
}
static __WIDL_INLINE ID3D10EffectMatrixVariable * ID3D10EffectDepthStencilVariable_AsMatrix(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->AsMatrix(This);
}
static __WIDL_INLINE ID3D10EffectStringVariable * ID3D10EffectDepthStencilVariable_AsString(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->AsString(This);
}
static __WIDL_INLINE ID3D10EffectShaderResourceVariable * ID3D10EffectDepthStencilVariable_AsShaderResource(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->AsShaderResource(This);
}
static __WIDL_INLINE ID3D10EffectRenderTargetViewVariable * ID3D10EffectDepthStencilVariable_AsRenderTargetView(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->AsRenderTargetView(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilViewVariable * ID3D10EffectDepthStencilVariable_AsDepthStencilView(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->AsDepthStencilView(This);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectDepthStencilVariable_AsConstantBuffer(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->AsConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectShaderVariable * ID3D10EffectDepthStencilVariable_AsShader(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->AsShader(This);
}
static __WIDL_INLINE ID3D10EffectBlendVariable * ID3D10EffectDepthStencilVariable_AsBlend(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->AsBlend(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilVariable * ID3D10EffectDepthStencilVariable_AsDepthStencil(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->AsDepthStencil(This);
}
static __WIDL_INLINE ID3D10EffectRasterizerVariable * ID3D10EffectDepthStencilVariable_AsRasterizer(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->AsRasterizer(This);
}
static __WIDL_INLINE ID3D10EffectSamplerVariable * ID3D10EffectDepthStencilVariable_AsSampler(ID3D10EffectDepthStencilVariable* This) {
    return This->lpVtbl->AsSampler(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectDepthStencilVariable_SetRawValue(ID3D10EffectDepthStencilVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->SetRawValue(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectDepthStencilVariable_GetRawValue(ID3D10EffectDepthStencilVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->GetRawValue(This,data,offset,count);
}
/*** ID3D10EffectDepthStencilVariable methods ***/
static __WIDL_INLINE HRESULT ID3D10EffectDepthStencilVariable_GetDepthStencilState(ID3D10EffectDepthStencilVariable* This,UINT index,ID3D10DepthStencilState **depth_stencil_state) {
    return This->lpVtbl->GetDepthStencilState(This,index,depth_stencil_state);
}
static __WIDL_INLINE HRESULT ID3D10EffectDepthStencilVariable_GetBackingStore(ID3D10EffectDepthStencilVariable* This,UINT index,D3D10_DEPTH_STENCIL_DESC *desc) {
    return This->lpVtbl->GetBackingStore(This,index,desc);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectDepthStencilVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectRasterizerVariable interface
 */
#ifndef __ID3D10EffectRasterizerVariable_INTERFACE_DEFINED__
#define __ID3D10EffectRasterizerVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectRasterizerVariable, 0x21af9f0e, 0x4d94, 0x4ea9, 0x97,0x85, 0x2c,0xb7,0x6b,0x8c,0x0b,0x34);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("21af9f0e-4d94-4ea9-9785-2cb76b8c0b34")
ID3D10EffectRasterizerVariable : public ID3D10EffectVariable
{
    virtual HRESULT STDMETHODCALLTYPE GetRasterizerState(
        UINT index,
        ID3D10RasterizerState **rasterizer_state) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBackingStore(
        UINT index,
        D3D10_RASTERIZER_DESC *desc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectRasterizerVariable, 0x21af9f0e, 0x4d94, 0x4ea9, 0x97,0x85, 0x2c,0xb7,0x6b,0x8c,0x0b,0x34)
#endif
#else
typedef struct ID3D10EffectRasterizerVariableVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectVariable methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectRasterizerVariable *This);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetType)(
        ID3D10EffectRasterizerVariable *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectRasterizerVariable *This,
        D3D10_EFFECT_VARIABLE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectRasterizerVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectRasterizerVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByIndex)(
        ID3D10EffectRasterizerVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByName)(
        ID3D10EffectRasterizerVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberBySemantic)(
        ID3D10EffectRasterizerVariable *This,
        const char *semantic);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetElement)(
        ID3D10EffectRasterizerVariable *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetParentConstantBuffer)(
        ID3D10EffectRasterizerVariable *This);

    ID3D10EffectScalarVariable * (STDMETHODCALLTYPE *AsScalar)(
        ID3D10EffectRasterizerVariable *This);

    ID3D10EffectVectorVariable * (STDMETHODCALLTYPE *AsVector)(
        ID3D10EffectRasterizerVariable *This);

    ID3D10EffectMatrixVariable * (STDMETHODCALLTYPE *AsMatrix)(
        ID3D10EffectRasterizerVariable *This);

    ID3D10EffectStringVariable * (STDMETHODCALLTYPE *AsString)(
        ID3D10EffectRasterizerVariable *This);

    ID3D10EffectShaderResourceVariable * (STDMETHODCALLTYPE *AsShaderResource)(
        ID3D10EffectRasterizerVariable *This);

    ID3D10EffectRenderTargetViewVariable * (STDMETHODCALLTYPE *AsRenderTargetView)(
        ID3D10EffectRasterizerVariable *This);

    ID3D10EffectDepthStencilViewVariable * (STDMETHODCALLTYPE *AsDepthStencilView)(
        ID3D10EffectRasterizerVariable *This);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *AsConstantBuffer)(
        ID3D10EffectRasterizerVariable *This);

    ID3D10EffectShaderVariable * (STDMETHODCALLTYPE *AsShader)(
        ID3D10EffectRasterizerVariable *This);

    ID3D10EffectBlendVariable * (STDMETHODCALLTYPE *AsBlend)(
        ID3D10EffectRasterizerVariable *This);

    ID3D10EffectDepthStencilVariable * (STDMETHODCALLTYPE *AsDepthStencil)(
        ID3D10EffectRasterizerVariable *This);

    ID3D10EffectRasterizerVariable * (STDMETHODCALLTYPE *AsRasterizer)(
        ID3D10EffectRasterizerVariable *This);

    ID3D10EffectSamplerVariable * (STDMETHODCALLTYPE *AsSampler)(
        ID3D10EffectRasterizerVariable *This);

    HRESULT (STDMETHODCALLTYPE *SetRawValue)(
        ID3D10EffectRasterizerVariable *This,
        void *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRawValue)(
        ID3D10EffectRasterizerVariable *This,
        void *data,
        UINT offset,
        UINT count);

    /*** ID3D10EffectRasterizerVariable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetRasterizerState)(
        ID3D10EffectRasterizerVariable *This,
        UINT index,
        ID3D10RasterizerState **rasterizer_state);

    HRESULT (STDMETHODCALLTYPE *GetBackingStore)(
        ID3D10EffectRasterizerVariable *This,
        UINT index,
        D3D10_RASTERIZER_DESC *desc);

    END_INTERFACE
} ID3D10EffectRasterizerVariableVtbl;

interface ID3D10EffectRasterizerVariable {
    CONST_VTBL ID3D10EffectRasterizerVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectVariable methods ***/
#define ID3D10EffectRasterizerVariable_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectRasterizerVariable_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D10EffectRasterizerVariable_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectRasterizerVariable_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectRasterizerVariable_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectRasterizerVariable_GetMemberByIndex(This,index) (This)->lpVtbl->GetMemberByIndex(This,index)
#define ID3D10EffectRasterizerVariable_GetMemberByName(This,name) (This)->lpVtbl->GetMemberByName(This,name)
#define ID3D10EffectRasterizerVariable_GetMemberBySemantic(This,semantic) (This)->lpVtbl->GetMemberBySemantic(This,semantic)
#define ID3D10EffectRasterizerVariable_GetElement(This,index) (This)->lpVtbl->GetElement(This,index)
#define ID3D10EffectRasterizerVariable_GetParentConstantBuffer(This) (This)->lpVtbl->GetParentConstantBuffer(This)
#define ID3D10EffectRasterizerVariable_AsScalar(This) (This)->lpVtbl->AsScalar(This)
#define ID3D10EffectRasterizerVariable_AsVector(This) (This)->lpVtbl->AsVector(This)
#define ID3D10EffectRasterizerVariable_AsMatrix(This) (This)->lpVtbl->AsMatrix(This)
#define ID3D10EffectRasterizerVariable_AsString(This) (This)->lpVtbl->AsString(This)
#define ID3D10EffectRasterizerVariable_AsShaderResource(This) (This)->lpVtbl->AsShaderResource(This)
#define ID3D10EffectRasterizerVariable_AsRenderTargetView(This) (This)->lpVtbl->AsRenderTargetView(This)
#define ID3D10EffectRasterizerVariable_AsDepthStencilView(This) (This)->lpVtbl->AsDepthStencilView(This)
#define ID3D10EffectRasterizerVariable_AsConstantBuffer(This) (This)->lpVtbl->AsConstantBuffer(This)
#define ID3D10EffectRasterizerVariable_AsShader(This) (This)->lpVtbl->AsShader(This)
#define ID3D10EffectRasterizerVariable_AsBlend(This) (This)->lpVtbl->AsBlend(This)
#define ID3D10EffectRasterizerVariable_AsDepthStencil(This) (This)->lpVtbl->AsDepthStencil(This)
#define ID3D10EffectRasterizerVariable_AsRasterizer(This) (This)->lpVtbl->AsRasterizer(This)
#define ID3D10EffectRasterizerVariable_AsSampler(This) (This)->lpVtbl->AsSampler(This)
#define ID3D10EffectRasterizerVariable_SetRawValue(This,data,offset,count) (This)->lpVtbl->SetRawValue(This,data,offset,count)
#define ID3D10EffectRasterizerVariable_GetRawValue(This,data,offset,count) (This)->lpVtbl->GetRawValue(This,data,offset,count)
/*** ID3D10EffectRasterizerVariable methods ***/
#define ID3D10EffectRasterizerVariable_GetRasterizerState(This,index,rasterizer_state) (This)->lpVtbl->GetRasterizerState(This,index,rasterizer_state)
#define ID3D10EffectRasterizerVariable_GetBackingStore(This,index,desc) (This)->lpVtbl->GetBackingStore(This,index,desc)
#else
/*** ID3D10EffectVariable methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectRasterizerVariable_IsValid(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectRasterizerVariable_GetType(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectRasterizerVariable_GetDesc(ID3D10EffectRasterizerVariable* This,D3D10_EFFECT_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectRasterizerVariable_GetAnnotationByIndex(ID3D10EffectRasterizerVariable* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectRasterizerVariable_GetAnnotationByName(ID3D10EffectRasterizerVariable* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectRasterizerVariable_GetMemberByIndex(ID3D10EffectRasterizerVariable* This,UINT index) {
    return This->lpVtbl->GetMemberByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectRasterizerVariable_GetMemberByName(ID3D10EffectRasterizerVariable* This,const char *name) {
    return This->lpVtbl->GetMemberByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectRasterizerVariable_GetMemberBySemantic(ID3D10EffectRasterizerVariable* This,const char *semantic) {
    return This->lpVtbl->GetMemberBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectRasterizerVariable_GetElement(ID3D10EffectRasterizerVariable* This,UINT index) {
    return This->lpVtbl->GetElement(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectRasterizerVariable_GetParentConstantBuffer(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->GetParentConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectScalarVariable * ID3D10EffectRasterizerVariable_AsScalar(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->AsScalar(This);
}
static __WIDL_INLINE ID3D10EffectVectorVariable * ID3D10EffectRasterizerVariable_AsVector(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->AsVector(This);
}
static __WIDL_INLINE ID3D10EffectMatrixVariable * ID3D10EffectRasterizerVariable_AsMatrix(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->AsMatrix(This);
}
static __WIDL_INLINE ID3D10EffectStringVariable * ID3D10EffectRasterizerVariable_AsString(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->AsString(This);
}
static __WIDL_INLINE ID3D10EffectShaderResourceVariable * ID3D10EffectRasterizerVariable_AsShaderResource(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->AsShaderResource(This);
}
static __WIDL_INLINE ID3D10EffectRenderTargetViewVariable * ID3D10EffectRasterizerVariable_AsRenderTargetView(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->AsRenderTargetView(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilViewVariable * ID3D10EffectRasterizerVariable_AsDepthStencilView(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->AsDepthStencilView(This);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectRasterizerVariable_AsConstantBuffer(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->AsConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectShaderVariable * ID3D10EffectRasterizerVariable_AsShader(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->AsShader(This);
}
static __WIDL_INLINE ID3D10EffectBlendVariable * ID3D10EffectRasterizerVariable_AsBlend(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->AsBlend(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilVariable * ID3D10EffectRasterizerVariable_AsDepthStencil(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->AsDepthStencil(This);
}
static __WIDL_INLINE ID3D10EffectRasterizerVariable * ID3D10EffectRasterizerVariable_AsRasterizer(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->AsRasterizer(This);
}
static __WIDL_INLINE ID3D10EffectSamplerVariable * ID3D10EffectRasterizerVariable_AsSampler(ID3D10EffectRasterizerVariable* This) {
    return This->lpVtbl->AsSampler(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectRasterizerVariable_SetRawValue(ID3D10EffectRasterizerVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->SetRawValue(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectRasterizerVariable_GetRawValue(ID3D10EffectRasterizerVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->GetRawValue(This,data,offset,count);
}
/*** ID3D10EffectRasterizerVariable methods ***/
static __WIDL_INLINE HRESULT ID3D10EffectRasterizerVariable_GetRasterizerState(ID3D10EffectRasterizerVariable* This,UINT index,ID3D10RasterizerState **rasterizer_state) {
    return This->lpVtbl->GetRasterizerState(This,index,rasterizer_state);
}
static __WIDL_INLINE HRESULT ID3D10EffectRasterizerVariable_GetBackingStore(ID3D10EffectRasterizerVariable* This,UINT index,D3D10_RASTERIZER_DESC *desc) {
    return This->lpVtbl->GetBackingStore(This,index,desc);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectRasterizerVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectSamplerVariable interface
 */
#ifndef __ID3D10EffectSamplerVariable_INTERFACE_DEFINED__
#define __ID3D10EffectSamplerVariable_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectSamplerVariable, 0x6530d5c7, 0x07e9, 0x4271, 0xa4,0x18, 0xe7,0xce,0x4b,0xd1,0xe4,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6530d5c7-07e9-4271-a418-e7ce4bd1e480")
ID3D10EffectSamplerVariable : public ID3D10EffectVariable
{
    virtual HRESULT STDMETHODCALLTYPE GetSampler(
        UINT index,
        ID3D10SamplerState **sampler) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetBackingStore(
        UINT index,
        D3D10_SAMPLER_DESC *desc) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectSamplerVariable, 0x6530d5c7, 0x07e9, 0x4271, 0xa4,0x18, 0xe7,0xce,0x4b,0xd1,0xe4,0x80)
#endif
#else
typedef struct ID3D10EffectSamplerVariableVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectVariable methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectSamplerVariable *This);

    ID3D10EffectType * (STDMETHODCALLTYPE *GetType)(
        ID3D10EffectSamplerVariable *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectSamplerVariable *This,
        D3D10_EFFECT_VARIABLE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectSamplerVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectSamplerVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByIndex)(
        ID3D10EffectSamplerVariable *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberByName)(
        ID3D10EffectSamplerVariable *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetMemberBySemantic)(
        ID3D10EffectSamplerVariable *This,
        const char *semantic);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetElement)(
        ID3D10EffectSamplerVariable *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetParentConstantBuffer)(
        ID3D10EffectSamplerVariable *This);

    ID3D10EffectScalarVariable * (STDMETHODCALLTYPE *AsScalar)(
        ID3D10EffectSamplerVariable *This);

    ID3D10EffectVectorVariable * (STDMETHODCALLTYPE *AsVector)(
        ID3D10EffectSamplerVariable *This);

    ID3D10EffectMatrixVariable * (STDMETHODCALLTYPE *AsMatrix)(
        ID3D10EffectSamplerVariable *This);

    ID3D10EffectStringVariable * (STDMETHODCALLTYPE *AsString)(
        ID3D10EffectSamplerVariable *This);

    ID3D10EffectShaderResourceVariable * (STDMETHODCALLTYPE *AsShaderResource)(
        ID3D10EffectSamplerVariable *This);

    ID3D10EffectRenderTargetViewVariable * (STDMETHODCALLTYPE *AsRenderTargetView)(
        ID3D10EffectSamplerVariable *This);

    ID3D10EffectDepthStencilViewVariable * (STDMETHODCALLTYPE *AsDepthStencilView)(
        ID3D10EffectSamplerVariable *This);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *AsConstantBuffer)(
        ID3D10EffectSamplerVariable *This);

    ID3D10EffectShaderVariable * (STDMETHODCALLTYPE *AsShader)(
        ID3D10EffectSamplerVariable *This);

    ID3D10EffectBlendVariable * (STDMETHODCALLTYPE *AsBlend)(
        ID3D10EffectSamplerVariable *This);

    ID3D10EffectDepthStencilVariable * (STDMETHODCALLTYPE *AsDepthStencil)(
        ID3D10EffectSamplerVariable *This);

    ID3D10EffectRasterizerVariable * (STDMETHODCALLTYPE *AsRasterizer)(
        ID3D10EffectSamplerVariable *This);

    ID3D10EffectSamplerVariable * (STDMETHODCALLTYPE *AsSampler)(
        ID3D10EffectSamplerVariable *This);

    HRESULT (STDMETHODCALLTYPE *SetRawValue)(
        ID3D10EffectSamplerVariable *This,
        void *data,
        UINT offset,
        UINT count);

    HRESULT (STDMETHODCALLTYPE *GetRawValue)(
        ID3D10EffectSamplerVariable *This,
        void *data,
        UINT offset,
        UINT count);

    /*** ID3D10EffectSamplerVariable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetSampler)(
        ID3D10EffectSamplerVariable *This,
        UINT index,
        ID3D10SamplerState **sampler);

    HRESULT (STDMETHODCALLTYPE *GetBackingStore)(
        ID3D10EffectSamplerVariable *This,
        UINT index,
        D3D10_SAMPLER_DESC *desc);

    END_INTERFACE
} ID3D10EffectSamplerVariableVtbl;

interface ID3D10EffectSamplerVariable {
    CONST_VTBL ID3D10EffectSamplerVariableVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectVariable methods ***/
#define ID3D10EffectSamplerVariable_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectSamplerVariable_GetType(This) (This)->lpVtbl->GetType(This)
#define ID3D10EffectSamplerVariable_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectSamplerVariable_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectSamplerVariable_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectSamplerVariable_GetMemberByIndex(This,index) (This)->lpVtbl->GetMemberByIndex(This,index)
#define ID3D10EffectSamplerVariable_GetMemberByName(This,name) (This)->lpVtbl->GetMemberByName(This,name)
#define ID3D10EffectSamplerVariable_GetMemberBySemantic(This,semantic) (This)->lpVtbl->GetMemberBySemantic(This,semantic)
#define ID3D10EffectSamplerVariable_GetElement(This,index) (This)->lpVtbl->GetElement(This,index)
#define ID3D10EffectSamplerVariable_GetParentConstantBuffer(This) (This)->lpVtbl->GetParentConstantBuffer(This)
#define ID3D10EffectSamplerVariable_AsScalar(This) (This)->lpVtbl->AsScalar(This)
#define ID3D10EffectSamplerVariable_AsVector(This) (This)->lpVtbl->AsVector(This)
#define ID3D10EffectSamplerVariable_AsMatrix(This) (This)->lpVtbl->AsMatrix(This)
#define ID3D10EffectSamplerVariable_AsString(This) (This)->lpVtbl->AsString(This)
#define ID3D10EffectSamplerVariable_AsShaderResource(This) (This)->lpVtbl->AsShaderResource(This)
#define ID3D10EffectSamplerVariable_AsRenderTargetView(This) (This)->lpVtbl->AsRenderTargetView(This)
#define ID3D10EffectSamplerVariable_AsDepthStencilView(This) (This)->lpVtbl->AsDepthStencilView(This)
#define ID3D10EffectSamplerVariable_AsConstantBuffer(This) (This)->lpVtbl->AsConstantBuffer(This)
#define ID3D10EffectSamplerVariable_AsShader(This) (This)->lpVtbl->AsShader(This)
#define ID3D10EffectSamplerVariable_AsBlend(This) (This)->lpVtbl->AsBlend(This)
#define ID3D10EffectSamplerVariable_AsDepthStencil(This) (This)->lpVtbl->AsDepthStencil(This)
#define ID3D10EffectSamplerVariable_AsRasterizer(This) (This)->lpVtbl->AsRasterizer(This)
#define ID3D10EffectSamplerVariable_AsSampler(This) (This)->lpVtbl->AsSampler(This)
#define ID3D10EffectSamplerVariable_SetRawValue(This,data,offset,count) (This)->lpVtbl->SetRawValue(This,data,offset,count)
#define ID3D10EffectSamplerVariable_GetRawValue(This,data,offset,count) (This)->lpVtbl->GetRawValue(This,data,offset,count)
/*** ID3D10EffectSamplerVariable methods ***/
#define ID3D10EffectSamplerVariable_GetSampler(This,index,sampler) (This)->lpVtbl->GetSampler(This,index,sampler)
#define ID3D10EffectSamplerVariable_GetBackingStore(This,index,desc) (This)->lpVtbl->GetBackingStore(This,index,desc)
#else
/*** ID3D10EffectVariable methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectSamplerVariable_IsValid(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE ID3D10EffectType * ID3D10EffectSamplerVariable_GetType(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->GetType(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectSamplerVariable_GetDesc(ID3D10EffectSamplerVariable* This,D3D10_EFFECT_VARIABLE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectSamplerVariable_GetAnnotationByIndex(ID3D10EffectSamplerVariable* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectSamplerVariable_GetAnnotationByName(ID3D10EffectSamplerVariable* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectSamplerVariable_GetMemberByIndex(ID3D10EffectSamplerVariable* This,UINT index) {
    return This->lpVtbl->GetMemberByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectSamplerVariable_GetMemberByName(ID3D10EffectSamplerVariable* This,const char *name) {
    return This->lpVtbl->GetMemberByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectSamplerVariable_GetMemberBySemantic(ID3D10EffectSamplerVariable* This,const char *semantic) {
    return This->lpVtbl->GetMemberBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectSamplerVariable_GetElement(ID3D10EffectSamplerVariable* This,UINT index) {
    return This->lpVtbl->GetElement(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectSamplerVariable_GetParentConstantBuffer(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->GetParentConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectScalarVariable * ID3D10EffectSamplerVariable_AsScalar(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->AsScalar(This);
}
static __WIDL_INLINE ID3D10EffectVectorVariable * ID3D10EffectSamplerVariable_AsVector(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->AsVector(This);
}
static __WIDL_INLINE ID3D10EffectMatrixVariable * ID3D10EffectSamplerVariable_AsMatrix(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->AsMatrix(This);
}
static __WIDL_INLINE ID3D10EffectStringVariable * ID3D10EffectSamplerVariable_AsString(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->AsString(This);
}
static __WIDL_INLINE ID3D10EffectShaderResourceVariable * ID3D10EffectSamplerVariable_AsShaderResource(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->AsShaderResource(This);
}
static __WIDL_INLINE ID3D10EffectRenderTargetViewVariable * ID3D10EffectSamplerVariable_AsRenderTargetView(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->AsRenderTargetView(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilViewVariable * ID3D10EffectSamplerVariable_AsDepthStencilView(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->AsDepthStencilView(This);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10EffectSamplerVariable_AsConstantBuffer(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->AsConstantBuffer(This);
}
static __WIDL_INLINE ID3D10EffectShaderVariable * ID3D10EffectSamplerVariable_AsShader(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->AsShader(This);
}
static __WIDL_INLINE ID3D10EffectBlendVariable * ID3D10EffectSamplerVariable_AsBlend(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->AsBlend(This);
}
static __WIDL_INLINE ID3D10EffectDepthStencilVariable * ID3D10EffectSamplerVariable_AsDepthStencil(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->AsDepthStencil(This);
}
static __WIDL_INLINE ID3D10EffectRasterizerVariable * ID3D10EffectSamplerVariable_AsRasterizer(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->AsRasterizer(This);
}
static __WIDL_INLINE ID3D10EffectSamplerVariable * ID3D10EffectSamplerVariable_AsSampler(ID3D10EffectSamplerVariable* This) {
    return This->lpVtbl->AsSampler(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectSamplerVariable_SetRawValue(ID3D10EffectSamplerVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->SetRawValue(This,data,offset,count);
}
static __WIDL_INLINE HRESULT ID3D10EffectSamplerVariable_GetRawValue(ID3D10EffectSamplerVariable* This,void *data,UINT offset,UINT count) {
    return This->lpVtbl->GetRawValue(This,data,offset,count);
}
/*** ID3D10EffectSamplerVariable methods ***/
static __WIDL_INLINE HRESULT ID3D10EffectSamplerVariable_GetSampler(ID3D10EffectSamplerVariable* This,UINT index,ID3D10SamplerState **sampler) {
    return This->lpVtbl->GetSampler(This,index,sampler);
}
static __WIDL_INLINE HRESULT ID3D10EffectSamplerVariable_GetBackingStore(ID3D10EffectSamplerVariable* This,UINT index,D3D10_SAMPLER_DESC *desc) {
    return This->lpVtbl->GetBackingStore(This,index,desc);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectSamplerVariable_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectTechnique interface
 */
#ifndef __ID3D10EffectTechnique_INTERFACE_DEFINED__
#define __ID3D10EffectTechnique_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectTechnique, 0xdb122ce8, 0xd1c9, 0x4292, 0xb2,0x37, 0x24,0xed,0x3d,0xe8,0xb1,0x75);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("db122ce8-d1c9-4292-b237-24ed3de8b175")
ID3D10EffectTechnique
{

    BEGIN_INTERFACE

    virtual WINBOOL STDMETHODCALLTYPE IsValid(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDesc(
        D3D10_TECHNIQUE_DESC *desc) = 0;

    virtual ID3D10EffectVariable * STDMETHODCALLTYPE GetAnnotationByIndex(
        UINT index) = 0;

    virtual ID3D10EffectVariable * STDMETHODCALLTYPE GetAnnotationByName(
        const char *name) = 0;

    virtual ID3D10EffectPass * STDMETHODCALLTYPE GetPassByIndex(
        UINT index) = 0;

    virtual ID3D10EffectPass * STDMETHODCALLTYPE GetPassByName(
        const char *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE ComputeStateBlockMask(
        D3D10_STATE_BLOCK_MASK *mask) = 0;

    END_INTERFACE

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectTechnique, 0xdb122ce8, 0xd1c9, 0x4292, 0xb2,0x37, 0x24,0xed,0x3d,0xe8,0xb1,0x75)
#endif
#else
typedef struct ID3D10EffectTechniqueVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectTechnique methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectTechnique *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectTechnique *This,
        D3D10_TECHNIQUE_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectTechnique *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectTechnique *This,
        const char *name);

    ID3D10EffectPass * (STDMETHODCALLTYPE *GetPassByIndex)(
        ID3D10EffectTechnique *This,
        UINT index);

    ID3D10EffectPass * (STDMETHODCALLTYPE *GetPassByName)(
        ID3D10EffectTechnique *This,
        const char *name);

    HRESULT (STDMETHODCALLTYPE *ComputeStateBlockMask)(
        ID3D10EffectTechnique *This,
        D3D10_STATE_BLOCK_MASK *mask);

    END_INTERFACE
} ID3D10EffectTechniqueVtbl;

interface ID3D10EffectTechnique {
    CONST_VTBL ID3D10EffectTechniqueVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectTechnique methods ***/
#define ID3D10EffectTechnique_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectTechnique_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectTechnique_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectTechnique_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectTechnique_GetPassByIndex(This,index) (This)->lpVtbl->GetPassByIndex(This,index)
#define ID3D10EffectTechnique_GetPassByName(This,name) (This)->lpVtbl->GetPassByName(This,name)
#define ID3D10EffectTechnique_ComputeStateBlockMask(This,mask) (This)->lpVtbl->ComputeStateBlockMask(This,mask)
#else
/*** ID3D10EffectTechnique methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectTechnique_IsValid(ID3D10EffectTechnique* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectTechnique_GetDesc(ID3D10EffectTechnique* This,D3D10_TECHNIQUE_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectTechnique_GetAnnotationByIndex(ID3D10EffectTechnique* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectTechnique_GetAnnotationByName(ID3D10EffectTechnique* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE ID3D10EffectPass * ID3D10EffectTechnique_GetPassByIndex(ID3D10EffectTechnique* This,UINT index) {
    return This->lpVtbl->GetPassByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectPass * ID3D10EffectTechnique_GetPassByName(ID3D10EffectTechnique* This,const char *name) {
    return This->lpVtbl->GetPassByName(This,name);
}
static __WIDL_INLINE HRESULT ID3D10EffectTechnique_ComputeStateBlockMask(ID3D10EffectTechnique* This,D3D10_STATE_BLOCK_MASK *mask) {
    return This->lpVtbl->ComputeStateBlockMask(This,mask);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectTechnique_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10Effect interface
 */
#ifndef __ID3D10Effect_INTERFACE_DEFINED__
#define __ID3D10Effect_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10Effect, 0x51b0ca8b, 0xec0b, 0x4519, 0x87,0x0d, 0x8e,0xe1,0xcb,0x50,0x17,0xc7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("51b0ca8b-ec0b-4519-870d-8ee1cb5017c7")
ID3D10Effect : public IUnknown
{
    virtual WINBOOL STDMETHODCALLTYPE IsValid(
        ) = 0;

    virtual WINBOOL STDMETHODCALLTYPE IsPool(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDevice(
        ID3D10Device **device) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDesc(
        D3D10_EFFECT_DESC *desc) = 0;

    virtual ID3D10EffectConstantBuffer * STDMETHODCALLTYPE GetConstantBufferByIndex(
        UINT index) = 0;

    virtual ID3D10EffectConstantBuffer * STDMETHODCALLTYPE GetConstantBufferByName(
        const char *name) = 0;

    virtual ID3D10EffectVariable * STDMETHODCALLTYPE GetVariableByIndex(
        UINT index) = 0;

    virtual ID3D10EffectVariable * STDMETHODCALLTYPE GetVariableByName(
        const char *name) = 0;

    virtual ID3D10EffectVariable * STDMETHODCALLTYPE GetVariableBySemantic(
        const char *semantic) = 0;

    virtual ID3D10EffectTechnique * STDMETHODCALLTYPE GetTechniqueByIndex(
        UINT index) = 0;

    virtual ID3D10EffectTechnique * STDMETHODCALLTYPE GetTechniqueByName(
        const char *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE Optimize(
        ) = 0;

    virtual WINBOOL STDMETHODCALLTYPE IsOptimized(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10Effect, 0x51b0ca8b, 0xec0b, 0x4519, 0x87,0x0d, 0x8e,0xe1,0xcb,0x50,0x17,0xc7)
#endif
#else
typedef struct ID3D10EffectVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D10Effect *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D10Effect *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D10Effect *This);

    /*** ID3D10Effect methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10Effect *This);

    WINBOOL (STDMETHODCALLTYPE *IsPool)(
        ID3D10Effect *This);

    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D10Effect *This,
        ID3D10Device **device);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10Effect *This,
        D3D10_EFFECT_DESC *desc);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetConstantBufferByIndex)(
        ID3D10Effect *This,
        UINT index);

    ID3D10EffectConstantBuffer * (STDMETHODCALLTYPE *GetConstantBufferByName)(
        ID3D10Effect *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetVariableByIndex)(
        ID3D10Effect *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetVariableByName)(
        ID3D10Effect *This,
        const char *name);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetVariableBySemantic)(
        ID3D10Effect *This,
        const char *semantic);

    ID3D10EffectTechnique * (STDMETHODCALLTYPE *GetTechniqueByIndex)(
        ID3D10Effect *This,
        UINT index);

    ID3D10EffectTechnique * (STDMETHODCALLTYPE *GetTechniqueByName)(
        ID3D10Effect *This,
        const char *name);

    HRESULT (STDMETHODCALLTYPE *Optimize)(
        ID3D10Effect *This);

    WINBOOL (STDMETHODCALLTYPE *IsOptimized)(
        ID3D10Effect *This);

    END_INTERFACE
} ID3D10EffectVtbl;

interface ID3D10Effect {
    CONST_VTBL ID3D10EffectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D10Effect_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D10Effect_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D10Effect_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D10Effect methods ***/
#define ID3D10Effect_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10Effect_IsPool(This) (This)->lpVtbl->IsPool(This)
#define ID3D10Effect_GetDevice(This,device) (This)->lpVtbl->GetDevice(This,device)
#define ID3D10Effect_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10Effect_GetConstantBufferByIndex(This,index) (This)->lpVtbl->GetConstantBufferByIndex(This,index)
#define ID3D10Effect_GetConstantBufferByName(This,name) (This)->lpVtbl->GetConstantBufferByName(This,name)
#define ID3D10Effect_GetVariableByIndex(This,index) (This)->lpVtbl->GetVariableByIndex(This,index)
#define ID3D10Effect_GetVariableByName(This,name) (This)->lpVtbl->GetVariableByName(This,name)
#define ID3D10Effect_GetVariableBySemantic(This,semantic) (This)->lpVtbl->GetVariableBySemantic(This,semantic)
#define ID3D10Effect_GetTechniqueByIndex(This,index) (This)->lpVtbl->GetTechniqueByIndex(This,index)
#define ID3D10Effect_GetTechniqueByName(This,name) (This)->lpVtbl->GetTechniqueByName(This,name)
#define ID3D10Effect_Optimize(This) (This)->lpVtbl->Optimize(This)
#define ID3D10Effect_IsOptimized(This) (This)->lpVtbl->IsOptimized(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D10Effect_QueryInterface(ID3D10Effect* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D10Effect_AddRef(ID3D10Effect* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D10Effect_Release(ID3D10Effect* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D10Effect methods ***/
static __WIDL_INLINE WINBOOL ID3D10Effect_IsValid(ID3D10Effect* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE WINBOOL ID3D10Effect_IsPool(ID3D10Effect* This) {
    return This->lpVtbl->IsPool(This);
}
static __WIDL_INLINE HRESULT ID3D10Effect_GetDevice(ID3D10Effect* This,ID3D10Device **device) {
    return This->lpVtbl->GetDevice(This,device);
}
static __WIDL_INLINE HRESULT ID3D10Effect_GetDesc(ID3D10Effect* This,D3D10_EFFECT_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10Effect_GetConstantBufferByIndex(ID3D10Effect* This,UINT index) {
    return This->lpVtbl->GetConstantBufferByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectConstantBuffer * ID3D10Effect_GetConstantBufferByName(ID3D10Effect* This,const char *name) {
    return This->lpVtbl->GetConstantBufferByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10Effect_GetVariableByIndex(ID3D10Effect* This,UINT index) {
    return This->lpVtbl->GetVariableByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10Effect_GetVariableByName(ID3D10Effect* This,const char *name) {
    return This->lpVtbl->GetVariableByName(This,name);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10Effect_GetVariableBySemantic(ID3D10Effect* This,const char *semantic) {
    return This->lpVtbl->GetVariableBySemantic(This,semantic);
}
static __WIDL_INLINE ID3D10EffectTechnique * ID3D10Effect_GetTechniqueByIndex(ID3D10Effect* This,UINT index) {
    return This->lpVtbl->GetTechniqueByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectTechnique * ID3D10Effect_GetTechniqueByName(ID3D10Effect* This,const char *name) {
    return This->lpVtbl->GetTechniqueByName(This,name);
}
static __WIDL_INLINE HRESULT ID3D10Effect_Optimize(ID3D10Effect* This) {
    return This->lpVtbl->Optimize(This);
}
static __WIDL_INLINE WINBOOL ID3D10Effect_IsOptimized(ID3D10Effect* This) {
    return This->lpVtbl->IsOptimized(This);
}
#endif
#endif

#endif


#endif  /* __ID3D10Effect_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectPool interface
 */
#ifndef __ID3D10EffectPool_INTERFACE_DEFINED__
#define __ID3D10EffectPool_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectPool, 0x9537ab04, 0x3250, 0x412e, 0x82,0x13, 0xfc,0xd2,0xf8,0x67,0x79,0x33);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9537ab04-3250-412e-8213-fcd2f8677933")
ID3D10EffectPool : public IUnknown
{
    virtual ID3D10Effect * STDMETHODCALLTYPE AsEffect(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectPool, 0x9537ab04, 0x3250, 0x412e, 0x82,0x13, 0xfc,0xd2,0xf8,0x67,0x79,0x33)
#endif
#else
typedef struct ID3D10EffectPoolVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D10EffectPool *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D10EffectPool *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D10EffectPool *This);

    /*** ID3D10EffectPool methods ***/
    ID3D10Effect * (STDMETHODCALLTYPE *AsEffect)(
        ID3D10EffectPool *This);

    END_INTERFACE
} ID3D10EffectPoolVtbl;

interface ID3D10EffectPool {
    CONST_VTBL ID3D10EffectPoolVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D10EffectPool_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D10EffectPool_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D10EffectPool_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D10EffectPool methods ***/
#define ID3D10EffectPool_AsEffect(This) (This)->lpVtbl->AsEffect(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D10EffectPool_QueryInterface(ID3D10EffectPool* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D10EffectPool_AddRef(ID3D10EffectPool* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D10EffectPool_Release(ID3D10EffectPool* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D10EffectPool methods ***/
static __WIDL_INLINE ID3D10Effect * ID3D10EffectPool_AsEffect(ID3D10EffectPool* This) {
    return This->lpVtbl->AsEffect(This);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectPool_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10EffectPass interface
 */
#ifndef __ID3D10EffectPass_INTERFACE_DEFINED__
#define __ID3D10EffectPass_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10EffectPass, 0x5cfbeb89, 0x1a06, 0x46e0, 0xb2,0x82, 0xe3,0xf9,0xbf,0xa3,0x6a,0x54);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5cfbeb89-1a06-46e0-b282-e3f9bfa36a54")
ID3D10EffectPass
{

    BEGIN_INTERFACE

    virtual WINBOOL STDMETHODCALLTYPE IsValid(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDesc(
        D3D10_PASS_DESC *desc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVertexShaderDesc(
        D3D10_PASS_SHADER_DESC *desc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetGeometryShaderDesc(
        D3D10_PASS_SHADER_DESC *desc) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetPixelShaderDesc(
        D3D10_PASS_SHADER_DESC *desc) = 0;

    virtual ID3D10EffectVariable * STDMETHODCALLTYPE GetAnnotationByIndex(
        UINT index) = 0;

    virtual ID3D10EffectVariable * STDMETHODCALLTYPE GetAnnotationByName(
        const char *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE Apply(
        UINT flags) = 0;

    virtual HRESULT STDMETHODCALLTYPE ComputeStateBlockMask(
        D3D10_STATE_BLOCK_MASK *mask) = 0;

    END_INTERFACE

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10EffectPass, 0x5cfbeb89, 0x1a06, 0x46e0, 0xb2,0x82, 0xe3,0xf9,0xbf,0xa3,0x6a,0x54)
#endif
#else
typedef struct ID3D10EffectPassVtbl {
    BEGIN_INTERFACE

    /*** ID3D10EffectPass methods ***/
    WINBOOL (STDMETHODCALLTYPE *IsValid)(
        ID3D10EffectPass *This);

    HRESULT (STDMETHODCALLTYPE *GetDesc)(
        ID3D10EffectPass *This,
        D3D10_PASS_DESC *desc);

    HRESULT (STDMETHODCALLTYPE *GetVertexShaderDesc)(
        ID3D10EffectPass *This,
        D3D10_PASS_SHADER_DESC *desc);

    HRESULT (STDMETHODCALLTYPE *GetGeometryShaderDesc)(
        ID3D10EffectPass *This,
        D3D10_PASS_SHADER_DESC *desc);

    HRESULT (STDMETHODCALLTYPE *GetPixelShaderDesc)(
        ID3D10EffectPass *This,
        D3D10_PASS_SHADER_DESC *desc);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByIndex)(
        ID3D10EffectPass *This,
        UINT index);

    ID3D10EffectVariable * (STDMETHODCALLTYPE *GetAnnotationByName)(
        ID3D10EffectPass *This,
        const char *name);

    HRESULT (STDMETHODCALLTYPE *Apply)(
        ID3D10EffectPass *This,
        UINT flags);

    HRESULT (STDMETHODCALLTYPE *ComputeStateBlockMask)(
        ID3D10EffectPass *This,
        D3D10_STATE_BLOCK_MASK *mask);

    END_INTERFACE
} ID3D10EffectPassVtbl;

interface ID3D10EffectPass {
    CONST_VTBL ID3D10EffectPassVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** ID3D10EffectPass methods ***/
#define ID3D10EffectPass_IsValid(This) (This)->lpVtbl->IsValid(This)
#define ID3D10EffectPass_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
#define ID3D10EffectPass_GetVertexShaderDesc(This,desc) (This)->lpVtbl->GetVertexShaderDesc(This,desc)
#define ID3D10EffectPass_GetGeometryShaderDesc(This,desc) (This)->lpVtbl->GetGeometryShaderDesc(This,desc)
#define ID3D10EffectPass_GetPixelShaderDesc(This,desc) (This)->lpVtbl->GetPixelShaderDesc(This,desc)
#define ID3D10EffectPass_GetAnnotationByIndex(This,index) (This)->lpVtbl->GetAnnotationByIndex(This,index)
#define ID3D10EffectPass_GetAnnotationByName(This,name) (This)->lpVtbl->GetAnnotationByName(This,name)
#define ID3D10EffectPass_Apply(This,flags) (This)->lpVtbl->Apply(This,flags)
#define ID3D10EffectPass_ComputeStateBlockMask(This,mask) (This)->lpVtbl->ComputeStateBlockMask(This,mask)
#else
/*** ID3D10EffectPass methods ***/
static __WIDL_INLINE WINBOOL ID3D10EffectPass_IsValid(ID3D10EffectPass* This) {
    return This->lpVtbl->IsValid(This);
}
static __WIDL_INLINE HRESULT ID3D10EffectPass_GetDesc(ID3D10EffectPass* This,D3D10_PASS_DESC *desc) {
    return This->lpVtbl->GetDesc(This,desc);
}
static __WIDL_INLINE HRESULT ID3D10EffectPass_GetVertexShaderDesc(ID3D10EffectPass* This,D3D10_PASS_SHADER_DESC *desc) {
    return This->lpVtbl->GetVertexShaderDesc(This,desc);
}
static __WIDL_INLINE HRESULT ID3D10EffectPass_GetGeometryShaderDesc(ID3D10EffectPass* This,D3D10_PASS_SHADER_DESC *desc) {
    return This->lpVtbl->GetGeometryShaderDesc(This,desc);
}
static __WIDL_INLINE HRESULT ID3D10EffectPass_GetPixelShaderDesc(ID3D10EffectPass* This,D3D10_PASS_SHADER_DESC *desc) {
    return This->lpVtbl->GetPixelShaderDesc(This,desc);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectPass_GetAnnotationByIndex(ID3D10EffectPass* This,UINT index) {
    return This->lpVtbl->GetAnnotationByIndex(This,index);
}
static __WIDL_INLINE ID3D10EffectVariable * ID3D10EffectPass_GetAnnotationByName(ID3D10EffectPass* This,const char *name) {
    return This->lpVtbl->GetAnnotationByName(This,name);
}
static __WIDL_INLINE HRESULT ID3D10EffectPass_Apply(ID3D10EffectPass* This,UINT flags) {
    return This->lpVtbl->Apply(This,flags);
}
static __WIDL_INLINE HRESULT ID3D10EffectPass_ComputeStateBlockMask(ID3D10EffectPass* This,D3D10_STATE_BLOCK_MASK *mask) {
    return This->lpVtbl->ComputeStateBlockMask(This,mask);
}
#endif
#endif

#endif


#endif  /* __ID3D10EffectPass_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ID3D10StateBlock interface
 */
#ifndef __ID3D10StateBlock_INTERFACE_DEFINED__
#define __ID3D10StateBlock_INTERFACE_DEFINED__

DEFINE_GUID(IID_ID3D10StateBlock, 0x0803425a, 0x57f5, 0x4dd6, 0x94,0x65, 0xa8,0x75,0x70,0x83,0x4a,0x08);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0803425a-57f5-4dd6-9465-a87570834a08")
ID3D10StateBlock : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Capture(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Apply(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReleaseAllDeviceObjects(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetDevice(
        ID3D10Device **device) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ID3D10StateBlock, 0x0803425a, 0x57f5, 0x4dd6, 0x94,0x65, 0xa8,0x75,0x70,0x83,0x4a,0x08)
#endif
#else
typedef struct ID3D10StateBlockVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ID3D10StateBlock *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ID3D10StateBlock *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ID3D10StateBlock *This);

    /*** ID3D10StateBlock methods ***/
    HRESULT (STDMETHODCALLTYPE *Capture)(
        ID3D10StateBlock *This);

    HRESULT (STDMETHODCALLTYPE *Apply)(
        ID3D10StateBlock *This);

    HRESULT (STDMETHODCALLTYPE *ReleaseAllDeviceObjects)(
        ID3D10StateBlock *This);

    HRESULT (STDMETHODCALLTYPE *GetDevice)(
        ID3D10StateBlock *This,
        ID3D10Device **device);

    END_INTERFACE
} ID3D10StateBlockVtbl;

interface ID3D10StateBlock {
    CONST_VTBL ID3D10StateBlockVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ID3D10StateBlock_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ID3D10StateBlock_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ID3D10StateBlock_Release(This) (This)->lpVtbl->Release(This)
/*** ID3D10StateBlock methods ***/
#define ID3D10StateBlock_Capture(This) (This)->lpVtbl->Capture(This)
#define ID3D10StateBlock_Apply(This) (This)->lpVtbl->Apply(This)
#define ID3D10StateBlock_ReleaseAllDeviceObjects(This) (This)->lpVtbl->ReleaseAllDeviceObjects(This)
#define ID3D10StateBlock_GetDevice(This,device) (This)->lpVtbl->GetDevice(This,device)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ID3D10StateBlock_QueryInterface(ID3D10StateBlock* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ID3D10StateBlock_AddRef(ID3D10StateBlock* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ID3D10StateBlock_Release(ID3D10StateBlock* This) {
    return This->lpVtbl->Release(This);
}
/*** ID3D10StateBlock methods ***/
static __WIDL_INLINE HRESULT ID3D10StateBlock_Capture(ID3D10StateBlock* This) {
    return This->lpVtbl->Capture(This);
}
static __WIDL_INLINE HRESULT ID3D10StateBlock_Apply(ID3D10StateBlock* This) {
    return This->lpVtbl->Apply(This);
}
static __WIDL_INLINE HRESULT ID3D10StateBlock_ReleaseAllDeviceObjects(ID3D10StateBlock* This) {
    return This->lpVtbl->ReleaseAllDeviceObjects(This);
}
static __WIDL_INLINE HRESULT ID3D10StateBlock_GetDevice(ID3D10StateBlock* This,ID3D10Device **device) {
    return This->lpVtbl->GetDevice(This,device);
}
#endif
#endif

#endif


#endif  /* __ID3D10StateBlock_INTERFACE_DEFINED__ */

HRESULT __stdcall  D3D10CompileEffectFromMemory(void *data,SIZE_T data_size,const char *filename,const D3D10_SHADER_MACRO *defines,ID3D10Include *include,UINT hlsl_flags,UINT fx_flags,ID3D10Blob **effect,ID3D10Blob **errors);

HRESULT __stdcall  D3D10CreateEffectFromMemory(void *data,SIZE_T data_size,UINT flags,ID3D10Device *device,ID3D10EffectPool *effect_pool,ID3D10Effect **effect);

HRESULT __stdcall  D3D10CreateEffectPoolFromMemory(void *data,SIZE_T data_size,UINT fx_flags,ID3D10Device *device,ID3D10EffectPool **effect_pool);

HRESULT __stdcall  D3D10CreateStateBlock(ID3D10Device *device,D3D10_STATE_BLOCK_MASK *mask,ID3D10StateBlock **stateblock);

HRESULT __stdcall  D3D10StateBlockMaskDifference(D3D10_STATE_BLOCK_MASK *mask_x,D3D10_STATE_BLOCK_MASK *mask_y,D3D10_STATE_BLOCK_MASK *result);

HRESULT __stdcall  D3D10StateBlockMaskDisableAll(D3D10_STATE_BLOCK_MASK *mask);

HRESULT __stdcall  D3D10StateBlockMaskDisableCapture(D3D10_STATE_BLOCK_MASK *mask,D3D10_DEVICE_STATE_TYPES state_type,UINT start_idx,UINT count);

HRESULT __stdcall  D3D10StateBlockMaskEnableAll(D3D10_STATE_BLOCK_MASK *mask);

HRESULT __stdcall  D3D10StateBlockMaskEnableCapture(D3D10_STATE_BLOCK_MASK *mask,D3D10_DEVICE_STATE_TYPES state_type,UINT start_idx,UINT count);

WINBOOL __stdcall  D3D10StateBlockMaskGetSetting(D3D10_STATE_BLOCK_MASK *mask,D3D10_DEVICE_STATE_TYPES state_type,UINT idx);

HRESULT __stdcall  D3D10StateBlockMaskIntersect(D3D10_STATE_BLOCK_MASK *mask_x,D3D10_STATE_BLOCK_MASK *mask_y,D3D10_STATE_BLOCK_MASK *result);

HRESULT __stdcall  D3D10StateBlockMaskUnion(D3D10_STATE_BLOCK_MASK *mask_x,D3D10_STATE_BLOCK_MASK *mask_y,D3D10_STATE_BLOCK_MASK *result);

/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __d3d10effect_h__ */
