windows-nt/Source/XPSP1/NT/multimedia/directx/dxvb/dx7vb/d3drmmeshbuilder3obj.cpp
2020-09-26 16:20:57 +08:00

515 lines
16 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: d3drmmeshbuilder3obj.cpp
//
//--------------------------------------------------------------------------
// d3drmMeshBuilderObj.cpp : Implementation of CDirectApp and DLL registration.
#include "stdafx.h"
#include "Direct.h"
#include "dms.h"
#include "d3drmMeshBuilder3Obj.h"
#include "d3drmMaterial2Obj.h"
#include "d3drmMeshObj.h"
#include "d3drmFrame3Obj.h"
#include "d3drmFace2Obj.h"
#include "d3drmFaceArrayObj.h"
#include "d3drmTexture3Obj.h"
#include "d3drmVisualObj.h"
extern HRESULT BSTRtoGUID(LPGUID,BSTR);
CONSTRUCTOR(_dxj_Direct3dRMMeshBuilder3, {});
DESTRUCTOR(_dxj_Direct3dRMMeshBuilder3, {});
GETSET_OBJECT(_dxj_Direct3dRMMeshBuilder3);
CLONE_R(_dxj_Direct3dRMMeshBuilder3,Direct3DRMMeshBuilder3);
GETNAME_R(_dxj_Direct3dRMMeshBuilder3);
SETNAME_R(_dxj_Direct3dRMMeshBuilder3);
GETCLASSNAME_R(_dxj_Direct3dRMMeshBuilder3);
ADDDESTROYCALLBACK_R(_dxj_Direct3dRMMeshBuilder3);
DELETEDESTROYCALLBACK_R(_dxj_Direct3dRMMeshBuilder3);
//CLONETO_RX(_dxj_Direct3dRMMeshBuilder3, MeshBuilder3, IID_IDirect3DRMMeshBuilder3);
PASS_THROUGH_CAST_2_R(_dxj_Direct3dRMMeshBuilder3, generateNormals, GenerateNormals, float,(float),long,(DWORD));
PASS_THROUGH1_R(_dxj_Direct3dRMMeshBuilder3, setQuality, SetQuality, d3drmRenderQuality)
PASS_THROUGH1_R(_dxj_Direct3dRMMeshBuilder3, setColor, SetColor, d3dcolor)
PASS_THROUGH_CAST_1_R(_dxj_Direct3dRMMeshBuilder3, setAppData, SetAppData, long,(DWORD));
PASS_THROUGH1_R(_dxj_Direct3dRMMeshBuilder3, setPerspective, SetPerspective, long); //BOOL
PASS_THROUGH_CAST_2_R(_dxj_Direct3dRMMeshBuilder3, setVertexColor, SetVertexColor, long,(DWORD),d3dcolor,(DWORD));
PASS_THROUGH3_R(_dxj_Direct3dRMMeshBuilder3, setColorRGB,SetColorRGB,d3dvalue,d3dvalue,d3dvalue)
PASS_THROUGH3_R(_dxj_Direct3dRMMeshBuilder3, scaleMesh, Scale, d3dvalue, d3dvalue, d3dvalue);
PASS_THROUGH3_R(_dxj_Direct3dRMMeshBuilder3, translate, Translate, d3dvalue, d3dvalue, d3dvalue);
PASS_THROUGH2_R(_dxj_Direct3dRMMeshBuilder3, setTextureTopology, SetTextureTopology, long, long); //BOOL
PASS_THROUGH_CAST_3_R(_dxj_Direct3dRMMeshBuilder3, setTextureCoordinates, SetTextureCoordinates, long,(DWORD), d3dvalue,(float), d3dvalue,(float));
PASS_THROUGH_CAST_3_R(_dxj_Direct3dRMMeshBuilder3, getTextureCoordinates, GetTextureCoordinates, long,(DWORD), d3dvalue*,(float*), d3dvalue*,(float*));
PASS_THROUGH_CAST_4_R(_dxj_Direct3dRMMeshBuilder3, setVertexColorRGB, SetVertexColorRGB, long,(DWORD), d3dvalue,(float), d3dvalue,(float), d3dvalue,(float));
PASS_THROUGH_CAST_1_R(_dxj_Direct3dRMMeshBuilder3, setColorSource, SetColorSource, d3drmColorSource, (enum _D3DRMCOLORSOURCE));
PASS_THROUGH_CAST_1_R(_dxj_Direct3dRMMeshBuilder3, getBox, GetBox, D3dRMBox *,(D3DRMBOX *))
GET_DIRECT_R(_dxj_Direct3dRMMeshBuilder3, getAppData, GetAppData, long);
GET_DIRECT_R(_dxj_Direct3dRMMeshBuilder3, getQuality, GetQuality, d3drmRenderQuality);
GET_DIRECT_R(_dxj_Direct3dRMMeshBuilder3, getPerspective, GetPerspective, long);
GET_DIRECT_R(_dxj_Direct3dRMMeshBuilder3, getVertexCount, GetVertexCount, int);
GET_DIRECT_R(_dxj_Direct3dRMMeshBuilder3, getColorSource, GetColorSource, d3drmColorSource);
GET_DIRECT1_R(_dxj_Direct3dRMMeshBuilder3, getVertexColor, GetVertexColor, d3dcolor, long);
PASS_THROUGH_CAST_4_R(_dxj_Direct3dRMMeshBuilder3, setVertex, SetVertex, long,(DWORD), d3dvalue,(float), d3dvalue,(float), d3dvalue,(float));
PASS_THROUGH_CAST_4_R(_dxj_Direct3dRMMeshBuilder3, setNormal, SetNormal, long,(DWORD), d3dvalue,(float), d3dvalue,(float), d3dvalue,(float));
GET_DIRECT_R(_dxj_Direct3dRMMeshBuilder3, getFaceCount, GetFaceCount, int );
DO_GETOBJECT_ANDUSEIT_R(_dxj_Direct3dRMMeshBuilder3, addMesh, AddMesh, _dxj_Direct3dRMMesh);
DO_GETOBJECT_ANDUSEIT_R(_dxj_Direct3dRMMeshBuilder3, addFace, AddFace, _dxj_Direct3dRMFace2);
DO_GETOBJECT_ANDUSEIT_R(_dxj_Direct3dRMMeshBuilder3, setMaterial, SetMaterial, _dxj_Direct3dRMMaterial2)
RETURN_NEW_ITEM_R(_dxj_Direct3dRMMeshBuilder3, getFaces, GetFaces, _dxj_Direct3dRMFaceArray);
RETURN_NEW_ITEM_R(_dxj_Direct3dRMMeshBuilder3, createMesh,CreateMesh,_dxj_Direct3dRMMesh)
RETURN_NEW_ITEM_R(_dxj_Direct3dRMMeshBuilder3, createFace, CreateFace, _dxj_Direct3dRMFace2);
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::addVertex(d3dvalue x, d3dvalue y, d3dvalue z, int *index)
{
*index = m__dxj_Direct3dRMMeshBuilder3->AddVertex(x,y,z);
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::addNormal(d3dvalue x, d3dvalue y, d3dvalue z, int *index)
{
*index = m__dxj_Direct3dRMMeshBuilder3->AddNormal(x,y,z);
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
//FOR JAVA
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::addFacesJava(long vcount, float *vertices,
long ncount, float *normals, long *data, I_dxj_Direct3dRMFaceArray **array)
{
HRESULT hr;
LPDIRECT3DRMFACEARRAY lpArray;
__try{
hr = m__dxj_Direct3dRMMeshBuilder3->AddFaces((DWORD)vcount/3, (struct _D3DVECTOR *)vertices, ncount/3, (struct _D3DVECTOR *)normals, (unsigned long *)data, &lpArray);
}
__except(1,1){
return E_INVALIDARG;
}
INTERNAL_CREATE(_dxj_Direct3dRMFaceArray, lpArray, array);
return hr;
}
/////////////////////////////////////////////////////////////////////////////
//STDMETHOD(Save)(BSTR fname, d3drmXofFormat format, d3dSaveOptions save);
//
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::save(BSTR Name, d3drmXofFormat ft, d3drmSaveFlags op)
{
USES_CONVERSION;
LPCTSTR pszName = W2T(Name); // Now convert to ANSI
return m__dxj_Direct3dRMMeshBuilder3->Save(pszName, (enum _D3DRMXOFFORMAT)ft, (DWORD) op );
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::loadFromFile(BSTR filename, VARIANT id, long flags, I_dxj_Direct3dRMLoadTextureCallback3 *callme, IUnknown *useMe)
{
D3DRMLOADTEXTURE3CALLBACK d3dtcb = NULL;
LPVOID pArgs = NULL;
TextureCallback3 *tcb = NULL;
HRESULT hr;
if( callme )
{
tcb = new TextureCallback3;
if( tcb )
{
tcb->c = callme;
tcb->pUser = useMe;
tcb->next = TextureCallbacks3;
tcb->prev = (TextureCallback3*)NULL;
TextureCallbacks3 = tcb;
d3dtcb = myLoadTextureCallback3;
pArgs = (void *)tcb;
}
else
{
DPF(1,"Callback object creation failed!\r\n");
return E_FAIL;
}
}
USES_CONVERSION;
LPCTSTR pszName = W2T(filename);
void *args=NULL;
DWORD pos=0;
GUID loadGuid;
VARIANT var;
VariantInit(&var);
if ((flags & D3DRMLOAD_BYNAME)||(D3DRMLOAD_FROMURL & flags)) {
hr=VariantChangeType(&var,&id,0,VT_BSTR);
if FAILED(hr) return E_INVALIDARG;
args=(void*)W2T(V_BSTR(&id));
}
else if(flags & D3DRMLOAD_BYPOSITION){
hr=VariantChangeType(&var,&id,0,VT_I4);
if FAILED(hr) return E_INVALIDARG;
pos=V_I4(&id);
args=&pos;
}
else if(flags & D3DRMLOAD_BYGUID){
hr=VariantChangeType(&var,&id,0,VT_BSTR);
if FAILED(hr) return E_INVALIDARG;
hr=BSTRtoGUID(&loadGuid,V_BSTR(&id));
if FAILED(hr) return E_INVALIDARG;
args=&loadGuid;
}
VariantClear(&var);
if (flags &D3DRMLOAD_FROMRESOURCE){
D3DRMLOADRESOURCE res;
ZeroMemory(&res,sizeof(D3DRMLOADRESOURCE));
res.lpName=pszName;
res.lpType="XFILE";
hr = m__dxj_Direct3dRMMeshBuilder3->Load((void *)&res, (DWORD*)args,(DWORD) flags,d3dtcb, pArgs);
}
else {
hr = m__dxj_Direct3dRMMeshBuilder3->Load((void *)pszName, (DWORD*)args,(DWORD) flags,d3dtcb, pArgs);
}
// Remove ourselves in a thread-safe manner.
if (tcb)
UndoCallbackLink((GeneralCallback*)tcb,
(GeneralCallback**)&TextureCallbacks3);
return hr;
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::getNormalCount(long *retval)
{
DWORD vc=0, nc=0, fsize=0;
//Get facedata size only. The other tqo sizes are ignored.
*retval= m__dxj_Direct3dRMMeshBuilder3->GetNormalCount();
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::getFaceDataSize(long *retval)
{
DWORD vc=0, nc=0, fsize=0;
//Get facedata size only. The other tqo sizes are ignored.
return m__dxj_Direct3dRMMeshBuilder3->GetGeometry(&vc, (struct _D3DVECTOR *)NULL,
&nc, (struct _D3DVECTOR *)NULL, (DWORD*)retval, (DWORD*)NULL);
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::addFrame(I_dxj_Direct3dRMFrame3 *frame){
DO_GETOBJECT_NOTNULL(LPDIRECT3DRMFRAME3,lpFrame,frame);
return m__dxj_Direct3dRMMeshBuilder3->AddFrame(lpFrame);
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::setTexture(I_dxj_Direct3dRMTexture3 *tex){
DO_GETOBJECT_NOTNULL(LPDIRECT3DRMTEXTURE3,lpTex,tex);
return m__dxj_Direct3dRMMeshBuilder3->SetTexture(lpTex);
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::addMeshBuilder(I_dxj_Direct3dRMMeshBuilder3 *mb, long flags){
DO_GETOBJECT_NOTNULL(LPDIRECT3DRMMESHBUILDER3,lpMb,mb);
return m__dxj_Direct3dRMMeshBuilder3->AddMeshBuilder(lpMb,(DWORD)flags);
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::getGeometry( SAFEARRAY **ppv,
SAFEARRAY **ppn, SAFEARRAY **ppfdata)
{
DWORD vc,nc,fsize;
if (!ppv) return E_INVALIDARG;
if (!ppn) return E_INVALIDARG;
if (!ppfdata) return E_INVALIDARG;
vc= (*ppv)->cbElements;
nc= (*ppn)->cbElements;
fsize= (*ppfdata)->cbElements;
//if (!ISSAFEARRAY1D(ppv,(DWORD)vc)) return E_INVALIDARG;
//if (!ISSAFEARRAY1D(ppn,(DWORD)nc)) return E_INVALIDARG;
//if (!ISSAFEARRAY1D(ppfdata,(DWORD)fsize)) return E_INVALIDARG;
return m__dxj_Direct3dRMMeshBuilder3->GetGeometry((DWORD*)&vc, (struct _D3DVECTOR *)((SAFEARRAY*)*ppv)->pvData, (DWORD*)&nc,
(struct _D3DVECTOR *)((SAFEARRAY*)*ppn)->pvData, (unsigned long *)fsize, (unsigned long *) ((SAFEARRAY*)*ppfdata)->pvData);
}
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::addFaces(long vcount, SAFEARRAY **ppv,
long ncount, SAFEARRAY **ppn, SAFEARRAY **ppfdata, I_dxj_Direct3dRMFaceArray **array)
{
HRESULT hr;
LPDIRECT3DRMFACEARRAY lpArray;
__try
{
hr = m__dxj_Direct3dRMMeshBuilder3->AddFaces(
(DWORD)vcount, (struct _D3DVECTOR *)((SAFEARRAY*)*ppv)->pvData,
(DWORD)ncount, (struct _D3DVECTOR *)((SAFEARRAY*)*ppn)->pvData,
(unsigned long *)((SAFEARRAY*)*ppfdata)->pvData, &lpArray);
}
__except(1,1)
{
return E_INVALIDARG;
}
if FAILED(hr) return hr;
INTERNAL_CREATE(_dxj_Direct3dRMFaceArray, lpArray, array);
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::addFacesIndexed(
/* [in] */ long flags,
/* [in] */ SAFEARRAY __RPC_FAR * __RPC_FAR *indexArray,
/* [retval][out] */ long __RPC_FAR *newFaceIndex)
{
HRESULT hr;
__try
{
hr = m__dxj_Direct3dRMMeshBuilder3->AddFacesIndexed(
(DWORD)flags, (DWORD *)((SAFEARRAY*)*indexArray)->pvData,
(DWORD*)newFaceIndex, NULL);
}
__except(1,1)
{
return E_INVALIDARG;
}
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::addTriangles(
/* [in] */ long format,
/* [in] */ long vertexCount,
/* [in] */ void *data)
{
HRESULT hr;
__try
{
hr = m__dxj_Direct3dRMMeshBuilder3->AddTriangles(
(DWORD)0, (DWORD) format, (DWORD) vertexCount,
data);
}
__except(1,1)
{
return E_INVALIDARG;
}
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::createSubMesh(
I_dxj_Direct3dRMMeshBuilder3 **ret)
{
HRESULT hr;
LPUNKNOWN pUnk=NULL;
LPDIRECT3DRMMESHBUILDER3 pMesh3=NULL;
*ret =NULL;
hr = m__dxj_Direct3dRMMeshBuilder3->CreateSubMesh(&pUnk);
if FAILED(hr) return hr;
if (!pUnk) return E_FAIL;
hr = pUnk->QueryInterface(IID_IDirect3DRMMeshBuilder3,(void**)&pMesh3);
pUnk->Release();
if FAILED(hr) return hr;
INTERNAL_CREATE(_dxj_Direct3dRMMeshBuilder3,pMesh3,ret);
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::deleteFace( I_dxj_Direct3dRMFace2 *face)
{
HRESULT hr;
if (!face) return E_INVALIDARG;
DO_GETOBJECT_NOTNULL(LPDIRECT3DRMFACE2,pFace,face);
__try {
hr = m__dxj_Direct3dRMMeshBuilder3->DeleteFace(pFace);
}
__except(1,1){
return E_FAIL;
}
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::deleteNormals( long id, long count)
{
HRESULT hr;
hr = m__dxj_Direct3dRMMeshBuilder3->DeleteNormals((DWORD)id,(DWORD)count);
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::deleteVertices(long id, long count)
{
HRESULT hr;
__try {
hr = m__dxj_Direct3dRMMeshBuilder3->DeleteVertices((DWORD)id,(DWORD) count);
}
__except(1,1){
return E_FAIL;
}
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::empty()
{
HRESULT hr;
hr = m__dxj_Direct3dRMMeshBuilder3->Empty((DWORD)0);
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::enableMesh(long flags)
{
HRESULT hr;
hr = m__dxj_Direct3dRMMeshBuilder3->Enable((DWORD)flags);
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::getEnable(long *flags)
{
HRESULT hr;
hr = m__dxj_Direct3dRMMeshBuilder3->GetEnable((DWORD*)flags);
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::getFace(long index, I_dxj_Direct3dRMFace2 **face)
{
HRESULT hr;
LPDIRECT3DRMFACE2 pFace=NULL;
*face=NULL;
hr = m__dxj_Direct3dRMMeshBuilder3->GetFace((DWORD)index,&pFace);
if FAILED(hr) return hr;
if (!pFace) return E_FAIL;
INTERNAL_CREATE(_dxj_Direct3dRMFace2,pFace,face);
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::getNormal(long index, D3dVector *vec)
{
HRESULT hr;
hr = m__dxj_Direct3dRMMeshBuilder3->GetNormal((DWORD)index,(D3DVECTOR*)vec);
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::getVertex(long index, D3dVector *vec)
{
HRESULT hr;
hr = m__dxj_Direct3dRMMeshBuilder3->GetVertex((DWORD)index,(D3DVECTOR*)vec);
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::optimize()
{
HRESULT hr;
hr = m__dxj_Direct3dRMMeshBuilder3->Optimize((DWORD)0);
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::deleteSubMesh(
I_dxj_Direct3dRMMeshBuilder3 *mesh)
{
HRESULT hr;
if (!mesh) return E_INVALIDARG;
DO_GETOBJECT_NOTNULL(LPDIRECT3DRMMESHBUILDER3,pMesh,mesh);
hr = m__dxj_Direct3dRMMeshBuilder3->DeleteSubMesh(pMesh);
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::getParentMesh(long flags,
I_dxj_Direct3dRMMeshBuilder3 **mesh)
{
HRESULT hr;
LPUNKNOWN pUnk=NULL;
LPDIRECT3DRMMESHBUILDER3 pMesh=NULL;
hr = m__dxj_Direct3dRMMeshBuilder3->GetParentMesh((DWORD)flags,&pUnk);
if FAILED(hr) return hr;
if (pUnk==NULL){
*mesh=NULL;
return S_OK;
}
hr= pUnk->QueryInterface(IID_IDirect3DRMMeshBuilder3,(void**)&pMesh);
pUnk->Release();
if FAILED(hr) return hr;
INTERNAL_CREATE(_dxj_Direct3dRMMeshBuilder3,pMesh,mesh);
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::getSubMeshCount(long *count)
{
HRESULT hr;
hr = m__dxj_Direct3dRMMeshBuilder3->GetSubMeshes((DWORD*)count,NULL);
return hr;
}
STDMETHODIMP C_dxj_Direct3dRMMeshBuilder3Object::getSubMeshes(long count,SAFEARRAY **psa)
{
HRESULT hr;
__try{
hr = m__dxj_Direct3dRMMeshBuilder3->GetSubMeshes((DWORD*)&count,(IUnknown**)((SAFEARRAY*)*psa)->pvData);
}
__except(1,1){
return E_INVALIDARG;
}
return hr;
}