2002-10-12 11:37:38 +00:00
|
|
|
/**
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
* ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version. The Blender
|
|
|
|
* Foundation also sells licenses for use in proprietary software under
|
|
|
|
* the Blender License. See http://www.blender.org/BL/ for information
|
|
|
|
* about this.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
|
|
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* The Original Code is: all of this file.
|
|
|
|
*
|
|
|
|
* Contributor(s): none yet.
|
|
|
|
*
|
|
|
|
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
|
|
|
* Convert blender data to ketsji
|
|
|
|
*/
|
|
|
|
|
2002-11-25 15:29:57 +00:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include <config.h>
|
|
|
|
#endif
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
#ifdef WIN32
|
|
|
|
#pragma warning (disable : 4786)
|
|
|
|
#endif
|
|
|
|
|
2004-05-21 09:21:15 +00:00
|
|
|
#include <math.h>
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
#include "BL_BlenderDataConversion.h"
|
|
|
|
#include "KX_BlenderGL.h"
|
|
|
|
#include "KX_BlenderScalarInterpolator.h"
|
|
|
|
|
|
|
|
#include "RAS_IPolygonMaterial.h"
|
2005-01-16 06:02:06 +00:00
|
|
|
#include "KX_PolygonMaterial.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
// Expressions
|
|
|
|
#include "ListValue.h"
|
|
|
|
#include "IntValue.h"
|
|
|
|
// Collision & Fuzzics LTD
|
|
|
|
|
|
|
|
#include "PHY_Pro.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include "KX_Scene.h"
|
|
|
|
#include "KX_GameObject.h"
|
|
|
|
#include "RAS_FramingManager.h"
|
|
|
|
#include "RAS_MeshObject.h"
|
|
|
|
|
|
|
|
#include "KX_ConvertActuators.h"
|
|
|
|
#include "KX_ConvertControllers.h"
|
|
|
|
#include "KX_ConvertSensors.h"
|
|
|
|
|
|
|
|
#include "SCA_LogicManager.h"
|
|
|
|
#include "SCA_EventManager.h"
|
|
|
|
#include "SCA_TimeEventManager.h"
|
|
|
|
#include "KX_Light.h"
|
|
|
|
#include "KX_Camera.h"
|
|
|
|
#include "KX_EmptyObject.h"
|
|
|
|
#include "MT_Point3.h"
|
|
|
|
#include "MT_Transform.h"
|
2004-03-22 22:02:18 +00:00
|
|
|
#include "MT_MinMax.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
#include "SCA_IInputDevice.h"
|
|
|
|
#include "RAS_TexMatrix.h"
|
|
|
|
#include "RAS_ICanvas.h"
|
|
|
|
#include "RAS_MaterialBucket.h"
|
|
|
|
//#include "KX_BlenderPolyMaterial.h"
|
|
|
|
#include "RAS_Polygon.h"
|
|
|
|
#include "RAS_TexVert.h"
|
|
|
|
#include "RAS_BucketManager.h"
|
|
|
|
#include "RAS_IRenderTools.h"
|
2006-01-06 03:46:54 +00:00
|
|
|
#include "BL_Material.h"
|
|
|
|
#include "KX_BlenderMaterial.h"
|
|
|
|
#include "BL_Texture.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
#include "DNA_action_types.h"
|
|
|
|
#include "BKE_main.h"
|
2004-12-29 01:31:17 +00:00
|
|
|
#include "BKE_global.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
#include "BL_SkinMeshObject.h"
|
|
|
|
#include "BL_SkinDeformer.h"
|
|
|
|
#include "BL_MeshDeformer.h"
|
|
|
|
//#include "BL_ArmatureController.h"
|
|
|
|
|
|
|
|
#include "BlenderWorldInfo.h"
|
|
|
|
|
|
|
|
#include "KX_KetsjiEngine.h"
|
|
|
|
#include "KX_BlenderSceneConverter.h"
|
|
|
|
|
|
|
|
#include"SND_Scene.h"
|
|
|
|
#include "SND_SoundListener.h"
|
|
|
|
|
|
|
|
/* This little block needed for linking to Blender... */
|
|
|
|
#ifdef WIN32
|
|
|
|
#include "BLI_winstuff.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* This list includes only data type definitions */
|
|
|
|
#include "DNA_object_types.h"
|
|
|
|
#include "DNA_material_types.h"
|
2006-01-06 03:46:54 +00:00
|
|
|
#include "DNA_texture_types.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
#include "DNA_image_types.h"
|
|
|
|
#include "DNA_lamp_types.h"
|
|
|
|
#include "DNA_group_types.h"
|
|
|
|
#include "DNA_scene_types.h"
|
|
|
|
#include "DNA_camera_types.h"
|
|
|
|
#include "DNA_property_types.h"
|
|
|
|
#include "DNA_text_types.h"
|
|
|
|
#include "DNA_sensor_types.h"
|
|
|
|
#include "DNA_controller_types.h"
|
|
|
|
#include "DNA_actuator_types.h"
|
|
|
|
#include "DNA_mesh_types.h"
|
2004-03-20 22:55:42 +00:00
|
|
|
#include "DNA_meshdata_types.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
#include "DNA_view3d_types.h"
|
|
|
|
#include "DNA_world_types.h"
|
|
|
|
#include "DNA_sound_types.h"
|
|
|
|
#include "DNA_key_types.h"
|
2005-04-23 11:36:44 +00:00
|
|
|
#include "DNA_armature_types.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
#include "BKE_utildefines.h"
|
|
|
|
#include "BKE_key.h"
|
|
|
|
#include "BKE_mesh.h"
|
|
|
|
#include "MT_Point3.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include "BKE_material.h" /* give_current_material */
|
|
|
|
/* end of blender include block */
|
|
|
|
|
|
|
|
#include "KX_BlenderInputDevice.h"
|
|
|
|
#include "KX_ConvertProperties.h"
|
|
|
|
#include "KX_HashedPtr.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include "KX_ScalarInterpolator.h"
|
|
|
|
|
|
|
|
#include "KX_IpoConvert.h"
|
|
|
|
#include "SYS_System.h"
|
|
|
|
|
|
|
|
#include "SG_Node.h"
|
2004-05-16 12:52:08 +00:00
|
|
|
#include "SG_BBox.h"
|
|
|
|
#include "SG_Tree.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2002-10-18 14:36:34 +00:00
|
|
|
// defines USE_ODE to choose physics engine
|
2002-10-12 11:37:38 +00:00
|
|
|
#include "KX_ConvertPhysicsObject.h"
|
|
|
|
|
|
|
|
|
|
|
|
// This file defines relationships between parents and children
|
|
|
|
// in the game engine.
|
|
|
|
|
|
|
|
#include "KX_SG_NodeRelationships.h"
|
2005-04-23 11:36:44 +00:00
|
|
|
#include "KX_SG_BoneParentNodeRelationship.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
#include "BL_ArmatureObject.h"
|
|
|
|
#include "BL_DeformableGameObject.h"
|
|
|
|
|
2006-12-16 05:50:38 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
#include "BSE_headerbuttons.h"
|
|
|
|
void update_for_newframe();
|
|
|
|
//void scene_update_for_newframe(struct Scene *sce, unsigned int lay);
|
|
|
|
//#include "BKE_ipo.h"
|
|
|
|
//void do_all_data_ipos(void);
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2004-12-01 08:43:02 +00:00
|
|
|
static int default_face_mode = TF_DYNAMIC;
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
static unsigned int KX_rgbaint2uint_new(unsigned int icol)
|
|
|
|
{
|
2004-11-25 08:09:18 +00:00
|
|
|
union
|
|
|
|
{
|
|
|
|
unsigned int integer;
|
|
|
|
unsigned char cp[4];
|
|
|
|
} out_colour, in_colour;
|
|
|
|
|
|
|
|
in_colour.integer = icol;
|
|
|
|
out_colour.cp[0] = in_colour.cp[3]; // red
|
|
|
|
out_colour.cp[1] = in_colour.cp[2]; // green
|
|
|
|
out_colour.cp[2] = in_colour.cp[1]; // blue
|
|
|
|
out_colour.cp[3] = in_colour.cp[0]; // alpha
|
|
|
|
|
|
|
|
return out_colour.integer;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Now the real converting starts... */
|
|
|
|
static unsigned int KX_Mcol2uint_new(MCol col)
|
|
|
|
{
|
|
|
|
/* color has to be converted without endian sensitivity. So no shifting! */
|
2004-11-25 08:09:18 +00:00
|
|
|
union
|
|
|
|
{
|
|
|
|
MCol col;
|
|
|
|
unsigned int integer;
|
|
|
|
unsigned char cp[4];
|
|
|
|
} out_colour, in_colour;
|
|
|
|
|
|
|
|
in_colour.col = col;
|
|
|
|
out_colour.cp[0] = in_colour.cp[3]; // red
|
|
|
|
out_colour.cp[1] = in_colour.cp[2]; // green
|
|
|
|
out_colour.cp[2] = in_colour.cp[1]; // blue
|
|
|
|
out_colour.cp[3] = in_colour.cp[0]; // alpha
|
|
|
|
|
|
|
|
return out_colour.integer;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
2004-12-01 08:43:02 +00:00
|
|
|
static void SetDefaultFaceType(Scene* scene)
|
|
|
|
{
|
|
|
|
default_face_mode = TF_DYNAMIC;
|
|
|
|
Base *base = static_cast<Base*>(scene->base.first);
|
|
|
|
while(base)
|
|
|
|
{
|
|
|
|
if (base->object->type == OB_LAMP)
|
|
|
|
{
|
|
|
|
default_face_mode = TF_DYNAMIC|TF_LIGHT;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
base = base->next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-01-06 03:46:54 +00:00
|
|
|
|
|
|
|
// --
|
|
|
|
static void GetRGB(short type,
|
|
|
|
MFace* mface,
|
|
|
|
MCol* mmcol,
|
|
|
|
Material *mat,
|
|
|
|
unsigned int &c0,
|
|
|
|
unsigned int &c1,
|
|
|
|
unsigned int &c2,
|
|
|
|
unsigned int &c3)
|
|
|
|
{
|
|
|
|
unsigned int colour = 0xFFFFFFFFL;
|
|
|
|
switch(type)
|
|
|
|
{
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
case 0: // vertex colors
|
2006-01-06 03:46:54 +00:00
|
|
|
{
|
|
|
|
if(mmcol) {
|
|
|
|
c0 = KX_Mcol2uint_new(mmcol[0]);
|
|
|
|
c1 = KX_Mcol2uint_new(mmcol[1]);
|
|
|
|
c2 = KX_Mcol2uint_new(mmcol[2]);
|
|
|
|
if (mface->v4)
|
|
|
|
c3 = KX_Mcol2uint_new(mmcol[3]);
|
|
|
|
}else // backup white
|
|
|
|
{
|
|
|
|
c0 = KX_rgbaint2uint_new(colour);
|
|
|
|
c1 = KX_rgbaint2uint_new(colour);
|
|
|
|
c2 = KX_rgbaint2uint_new(colour);
|
|
|
|
if (mface->v4)
|
|
|
|
c3 = KX_rgbaint2uint_new( colour );
|
|
|
|
}
|
|
|
|
} break;
|
|
|
|
|
|
|
|
|
|
|
|
case 1: // material rgba
|
|
|
|
{
|
|
|
|
if (mat) {
|
|
|
|
union {
|
|
|
|
unsigned char cp[4];
|
|
|
|
unsigned int integer;
|
|
|
|
} col_converter;
|
|
|
|
col_converter.cp[3] = (unsigned char) (mat->r*255.0);
|
|
|
|
col_converter.cp[2] = (unsigned char) (mat->g*255.0);
|
|
|
|
col_converter.cp[1] = (unsigned char) (mat->b*255.0);
|
|
|
|
col_converter.cp[0] = (unsigned char) (mat->alpha*255.0);
|
|
|
|
colour = col_converter.integer;
|
|
|
|
}
|
|
|
|
c0 = KX_rgbaint2uint_new(colour);
|
|
|
|
c1 = KX_rgbaint2uint_new(colour);
|
|
|
|
c2 = KX_rgbaint2uint_new(colour);
|
|
|
|
if (mface->v4)
|
|
|
|
c3 = KX_rgbaint2uint_new(colour);
|
|
|
|
} break;
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
default: // white
|
2006-01-06 03:46:54 +00:00
|
|
|
{
|
|
|
|
c0 = KX_rgbaint2uint_new(colour);
|
|
|
|
c1 = KX_rgbaint2uint_new(colour);
|
|
|
|
c2 = KX_rgbaint2uint_new(colour);
|
|
|
|
if (mface->v4)
|
|
|
|
c3 = KX_rgbaint2uint_new(colour);
|
|
|
|
} break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ------------------------------------
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
BL_Material* ConvertMaterial( Mesh* mesh, Material *mat, MTFace* tface, MFace* mface, MCol* mmcol, int lightlayer, Object* blenderobj )
|
2006-01-06 03:46:54 +00:00
|
|
|
{
|
2006-04-13 05:11:34 +00:00
|
|
|
//this needs some type of manager
|
2006-01-06 03:46:54 +00:00
|
|
|
BL_Material *material = new BL_Material();
|
2006-04-13 05:11:34 +00:00
|
|
|
|
2006-01-06 03:46:54 +00:00
|
|
|
int numchan = -1;
|
|
|
|
bool validmat = (mat!=0);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
bool validface = (mesh->mtface && tface);
|
2006-04-13 05:11:34 +00:00
|
|
|
|
2006-01-06 03:46:54 +00:00
|
|
|
short type = 0;
|
|
|
|
if( validmat )
|
|
|
|
type = 1; // material color
|
|
|
|
|
|
|
|
material->IdMode = DEFAULT_BLENDER;
|
|
|
|
|
|
|
|
// --------------------------------
|
|
|
|
if(validmat) {
|
|
|
|
|
|
|
|
// use vertex colors by explicitly setting
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if(mat->mode &MA_VERTEXCOLP)
|
|
|
|
type = 0;
|
2006-01-06 03:46:54 +00:00
|
|
|
|
|
|
|
// use lighting?
|
|
|
|
material->ras_mode |= ( mat->mode & MA_SHLESS )?0:USE_LIGHT;
|
|
|
|
MTex *mttmp = 0;
|
|
|
|
numchan = getNumTexChannels(mat);
|
|
|
|
int valid_index = 0;
|
|
|
|
|
2006-04-13 05:11:34 +00:00
|
|
|
// use the face texture if
|
|
|
|
// 1) it is set in the buttons
|
|
|
|
// 2) we have a face texture and a material but no valid texture in slot 1
|
|
|
|
bool facetex = false;
|
|
|
|
if(validface && mat->mode &MA_FACETEXTURE)
|
|
|
|
facetex = true;
|
|
|
|
if(validface && !mat->mtex[0])
|
|
|
|
facetex = true;
|
|
|
|
if(validface && mat->mtex[0]) {
|
|
|
|
MTex *tmp = mat->mtex[0];
|
|
|
|
if(!tmp->tex || tmp->tex && !tmp->tex->ima )
|
|
|
|
facetex = true;
|
|
|
|
}
|
|
|
|
numchan = numchan>MAXTEX?MAXTEX:numchan;
|
|
|
|
|
2006-01-06 03:46:54 +00:00
|
|
|
// foreach MTex
|
|
|
|
for(int i=0; i<numchan; i++) {
|
|
|
|
// use face tex
|
|
|
|
if(i==0 && facetex ) {
|
|
|
|
Image*tmp = (Image*)(tface->tpage);
|
|
|
|
if(tmp) {
|
|
|
|
material->img[i] = tmp;
|
|
|
|
material->texname[i] = material->img[i]->id.name;
|
|
|
|
material->flag[i] |= ( tface->transp &TF_ALPHA )?USEALPHA:0;
|
|
|
|
material->flag[i] |= ( tface->transp &TF_ADD )?CALCALPHA:0;
|
|
|
|
material->ras_mode|= ( tface->transp &(TF_ADD | TF_ALPHA))?TRANSP:0;
|
2006-02-13 05:45:32 +00:00
|
|
|
if(material->img[i]->flag & IMA_REFLECT)
|
|
|
|
material->mapping[i].mapping |= USEREFL;
|
|
|
|
else
|
|
|
|
material->mapping[i].mapping |= USEUV;
|
2006-04-13 05:11:34 +00:00
|
|
|
if(material->ras_mode & USE_LIGHT)
|
|
|
|
material->ras_mode &= ~USE_LIGHT;
|
|
|
|
if(tface->mode & TF_LIGHT)
|
|
|
|
material->ras_mode |= USE_LIGHT;
|
|
|
|
|
2006-01-06 03:46:54 +00:00
|
|
|
valid_index++;
|
|
|
|
}
|
2006-04-13 05:11:34 +00:00
|
|
|
else {
|
|
|
|
material->img[i] = 0;
|
|
|
|
material->texname[i] = "";
|
|
|
|
}
|
|
|
|
continue;
|
2006-01-06 03:46:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
mttmp = getImageFromMaterial( mat, i );
|
|
|
|
if( mttmp ) {
|
|
|
|
if( mttmp->tex ) {
|
|
|
|
if( mttmp->tex->type == TEX_IMAGE ) {
|
|
|
|
material->mtexname[i] = mttmp->tex->id.name;
|
|
|
|
material->img[i] = mttmp->tex->ima;
|
|
|
|
if( material->img[i] ) {
|
|
|
|
|
|
|
|
material->texname[i] = material->img[i]->id.name;
|
|
|
|
material->flag[i] |= ( mttmp->tex->imaflag &TEX_MIPMAP )?MIPMAP:0;
|
|
|
|
// -----------------------
|
|
|
|
if( mttmp->tex->imaflag &TEX_USEALPHA ) {
|
|
|
|
material->flag[i] |= USEALPHA;
|
|
|
|
}
|
|
|
|
// -----------------------
|
|
|
|
else if( mttmp->tex->imaflag &TEX_CALCALPHA ) {
|
|
|
|
material->flag[i] |= CALCALPHA;
|
2006-01-15 11:34:55 +00:00
|
|
|
}
|
|
|
|
else if(mttmp->tex->flag &TEX_NEGALPHA) {
|
|
|
|
material->flag[i] |= USENEGALPHA;
|
2006-01-06 03:46:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
material->color_blend[i] = mttmp->colfac;
|
|
|
|
material->flag[i] |= ( mttmp->mapto & MAP_ALPHA )?TEXALPHA:0;
|
|
|
|
material->flag[i] |= ( mttmp->texflag& MTEX_NEGATIVE )?TEXNEG:0;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(mttmp->tex->type == TEX_ENVMAP) {
|
|
|
|
if( mttmp->tex->env->stype == ENV_LOAD ) {
|
|
|
|
|
|
|
|
material->mtexname[i]= mttmp->tex->id.name;
|
|
|
|
material->cubemap[i] = mttmp->tex->env;
|
|
|
|
if(material->cubemap[i]->ima) {
|
|
|
|
material->texname[i] = material->cubemap[i]->ima->id.name;
|
|
|
|
material->mapping[i].mapping |= USEENV;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// in the player, we need to split it our self
|
|
|
|
material->cubemap[i]->ima = mttmp->tex->ima;
|
|
|
|
if(material->cubemap[i]->ima) {
|
|
|
|
material->texname[i] = material->cubemap[i]->ima->id.name;
|
|
|
|
material->mapping[i].mapping |= USEENV;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
material->flag[i] |= (mat->ipo!=0)?HASIPO:0;
|
|
|
|
/// --------------------------------
|
|
|
|
// mapping methods
|
|
|
|
material->mapping[i].mapping |= ( mttmp->texco & TEXCO_REFL )?USEREFL:0;
|
|
|
|
|
|
|
|
if(mttmp->texco & TEXCO_OBJECT) {
|
|
|
|
material->mapping[i].mapping |= USEOBJ;
|
|
|
|
if(mttmp->object)
|
|
|
|
material->mapping[i].objconame = mttmp->object->id.name;
|
|
|
|
}
|
2006-02-13 05:45:32 +00:00
|
|
|
else if(mttmp->texco &TEXCO_REFL)
|
|
|
|
material->mapping[i].mapping |= USEREFL;
|
|
|
|
else if(mttmp->texco &(TEXCO_ORCO|TEXCO_GLOB))
|
|
|
|
material->mapping[i].mapping |= USEORCO;
|
|
|
|
else if(mttmp->texco &TEXCO_UV)
|
|
|
|
material->mapping[i].mapping |= USEUV;
|
|
|
|
else if(mttmp->texco &TEXCO_NORM)
|
|
|
|
material->mapping[i].mapping |= USENORM;
|
2006-04-02 21:04:20 +00:00
|
|
|
else if(mttmp->texco &TEXCO_TANGENT)
|
|
|
|
material->mapping[i].mapping |= USETANG;
|
2006-02-13 05:45:32 +00:00
|
|
|
else
|
|
|
|
material->mapping[i].mapping |= DISABLE;
|
2006-01-06 03:46:54 +00:00
|
|
|
|
|
|
|
material->mapping[i].scale[0] = mttmp->size[0];
|
|
|
|
material->mapping[i].scale[1] = mttmp->size[1];
|
|
|
|
material->mapping[i].scale[2] = mttmp->size[2];
|
|
|
|
material->mapping[i].offsets[0] = mttmp->ofs[0];
|
|
|
|
material->mapping[i].offsets[1] = mttmp->ofs[1];
|
|
|
|
material->mapping[i].offsets[2] = mttmp->ofs[2];
|
|
|
|
|
|
|
|
material->mapping[i].projplane[0] = mttmp->projx;
|
|
|
|
material->mapping[i].projplane[1] = mttmp->projy;
|
|
|
|
material->mapping[i].projplane[2] = mttmp->projz;
|
|
|
|
/// --------------------------------
|
|
|
|
|
|
|
|
switch( mttmp->blendtype ) {
|
|
|
|
case MTEX_BLEND:
|
|
|
|
material->blend_mode[i] = BLEND_MIX;
|
|
|
|
break;
|
|
|
|
case MTEX_MUL:
|
|
|
|
material->blend_mode[i] = BLEND_MUL;
|
|
|
|
break;
|
|
|
|
case MTEX_ADD:
|
|
|
|
material->blend_mode[i] = BLEND_ADD;
|
|
|
|
break;
|
|
|
|
case MTEX_SUB:
|
|
|
|
material->blend_mode[i] = BLEND_SUB;
|
|
|
|
break;
|
|
|
|
case MTEX_SCREEN:
|
|
|
|
material->blend_mode[i] = BLEND_SCR;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
valid_index++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// above one tex the switches here
|
|
|
|
// are not used
|
|
|
|
switch(valid_index) {
|
|
|
|
case 0:
|
|
|
|
material->IdMode = DEFAULT_BLENDER;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
material->IdMode = ONETEX;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
material->IdMode = GREATERTHAN2;
|
|
|
|
break;
|
|
|
|
}
|
2006-02-13 05:45:32 +00:00
|
|
|
material->SetUsers(mat->id.us);
|
2006-01-06 03:46:54 +00:00
|
|
|
|
|
|
|
material->num_enabled = valid_index;
|
|
|
|
|
|
|
|
material->speccolor[0] = mat->specr;
|
|
|
|
material->speccolor[1] = mat->specg;
|
|
|
|
material->speccolor[2] = mat->specb;
|
|
|
|
material->hard = (float)mat->har/4.0f;
|
|
|
|
material->matcolor[0] = mat->r;
|
|
|
|
material->matcolor[1] = mat->g;
|
|
|
|
material->matcolor[2] = mat->b;
|
|
|
|
material->matcolor[3] = mat->alpha;
|
|
|
|
material->alpha = mat->alpha;
|
|
|
|
material->emit = mat->emit;
|
|
|
|
material->spec_f = mat->spec;
|
|
|
|
material->ref = mat->ref;
|
|
|
|
material->amb = mat->amb;
|
2006-04-11 05:57:30 +00:00
|
|
|
|
|
|
|
// set alpha testing without z-sorting
|
2006-04-13 05:11:34 +00:00
|
|
|
if( ( validface && (!tface->transp)) && mat->mode & MA_ZTRA) {
|
2006-04-11 05:57:30 +00:00
|
|
|
// sets the RAS_IPolyMaterial::m_flag |RAS_FORCEALPHA
|
|
|
|
// this is so we don't have the overhead of the z-sorting code
|
|
|
|
material->ras_mode|=ALPHA_TEST;
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
// use regular z-sorting
|
|
|
|
material->ras_mode |= ((mat->mode & MA_ZTRA) != 0)?ZSORT:0;
|
|
|
|
}
|
2006-01-10 06:34:42 +00:00
|
|
|
material->ras_mode |= ((mat->mode & MA_WIRE) != 0)?WIRE:0;
|
2006-01-06 03:46:54 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
int valid = 0;
|
|
|
|
// check for tface tex to fallback on
|
2006-04-13 05:11:34 +00:00
|
|
|
if( validface ){
|
|
|
|
|
|
|
|
// no light bugfix
|
|
|
|
if(tface->mode) material->ras_mode |= USE_LIGHT;
|
|
|
|
|
2006-01-06 03:46:54 +00:00
|
|
|
material->img[0] = (Image*)(tface->tpage);
|
|
|
|
// ------------------------
|
|
|
|
if(material->img[0]) {
|
|
|
|
material->texname[0] = material->img[0]->id.name;
|
|
|
|
material->mapping[0].mapping |= ( (material->img[0]->flag & IMA_REFLECT)!=0 )?USEREFL:0;
|
|
|
|
material->flag[0] |= ( tface->transp &TF_ALPHA )?USEALPHA:0;
|
|
|
|
material->flag[0] |= ( tface->transp &TF_ADD )?CALCALPHA:0;
|
|
|
|
material->ras_mode|= ( tface->transp & (TF_ADD|TF_ALPHA))?TRANSP:0;
|
|
|
|
valid++;
|
|
|
|
}
|
|
|
|
}
|
2006-02-13 05:45:32 +00:00
|
|
|
material->SetUsers(-1);
|
2006-01-06 03:46:54 +00:00
|
|
|
material->num_enabled = valid;
|
|
|
|
material->IdMode = TEXFACE;
|
|
|
|
material->speccolor[0] = 1.f;
|
|
|
|
material->speccolor[1] = 1.f;
|
|
|
|
material->speccolor[2] = 1.f;
|
|
|
|
material->hard = 35.f;
|
|
|
|
material->matcolor[0] = 0.5f;
|
|
|
|
material->matcolor[1] = 0.5f;
|
|
|
|
material->matcolor[2] = 0.5f;
|
|
|
|
material->spec_f = 0.5f;
|
|
|
|
material->ref = 0.8f;
|
|
|
|
}
|
|
|
|
MT_Point2 uv[4];
|
|
|
|
|
2006-04-13 05:11:34 +00:00
|
|
|
if( validface ) {
|
2006-01-06 03:46:54 +00:00
|
|
|
|
|
|
|
material->ras_mode |= !(
|
|
|
|
(tface->flag & TF_HIDE) ||
|
|
|
|
(tface->mode & TF_INVISIBLE)
|
|
|
|
)?POLY_VIS:0;
|
|
|
|
|
|
|
|
material->ras_mode |= ( (tface->mode & TF_DYNAMIC)!= 0 )?COLLIDER:0;
|
|
|
|
material->transp = tface->transp;
|
|
|
|
|
|
|
|
if(tface->transp)
|
|
|
|
material->ras_mode |= TRANSP;
|
|
|
|
|
|
|
|
material->tile = tface->tile;
|
|
|
|
material->mode = tface->mode;
|
|
|
|
|
|
|
|
uv[0] = MT_Point2(tface->uv[0]);
|
|
|
|
uv[1] = MT_Point2(tface->uv[1]);
|
|
|
|
uv[2] = MT_Point2(tface->uv[2]);
|
|
|
|
|
|
|
|
if (mface->v4)
|
|
|
|
uv[3] = MT_Point2(tface->uv[3]);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
// nothing at all
|
|
|
|
material->ras_mode |= (COLLIDER|POLY_VIS| (validmat?0:USE_LIGHT));
|
|
|
|
material->mode = default_face_mode;
|
|
|
|
material->transp = TF_SOLID;
|
|
|
|
material->tile = 0;
|
|
|
|
}
|
|
|
|
unsigned int rgb[4];
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
GetRGB(type,mface,mmcol,mat,rgb[0],rgb[1],rgb[2], rgb[3]);
|
2006-01-06 03:46:54 +00:00
|
|
|
material->SetConversionRGB(rgb);
|
|
|
|
material->SetConversionUV(uv);
|
|
|
|
|
|
|
|
material->ras_mode |= (mface->v4==0)?TRIANGLE:0;
|
|
|
|
if(validmat)
|
|
|
|
material->matname =(mat->id.name);
|
|
|
|
|
|
|
|
material->tface = tface;
|
|
|
|
material->material = mat;
|
|
|
|
return material;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-02-13 05:45:32 +00:00
|
|
|
static void BL_ComputeTriTangentSpace(const MT_Vector3 &v1, const MT_Vector3 &v2, const MT_Vector3 &v3,
|
|
|
|
const MT_Vector2 &uv1, const MT_Vector2 &uv2, const MT_Vector2 &uv3,
|
|
|
|
MFace* mface, MT_Vector3 *tan1, MT_Vector3 *tan2)
|
|
|
|
{
|
|
|
|
MT_Vector3 dx1(v2 - v1), dx2(v3 - v1);
|
|
|
|
MT_Vector2 duv1(uv2 - uv1), duv2(uv3 - uv1);
|
|
|
|
|
|
|
|
MT_Scalar r = 1.0 / (duv1.x() * duv2.y() - duv2.x() * duv1.y());
|
|
|
|
duv1 *= r;
|
|
|
|
duv2 *= r;
|
|
|
|
MT_Vector3 sdir(duv2.y() * dx1 - duv1.y() * dx2);
|
|
|
|
MT_Vector3 tdir(duv1.x() * dx2 - duv2.x() * dx1);
|
|
|
|
|
|
|
|
tan1[mface->v1] += sdir;
|
|
|
|
tan1[mface->v2] += sdir;
|
|
|
|
tan1[mface->v3] += sdir;
|
|
|
|
|
|
|
|
tan2[mface->v1] += tdir;
|
|
|
|
tan2[mface->v2] += tdir;
|
|
|
|
tan2[mface->v3] += tdir;
|
|
|
|
}
|
|
|
|
|
|
|
|
static MT_Vector4* BL_ComputeMeshTangentSpace(Mesh* mesh)
|
|
|
|
{
|
|
|
|
MFace* mface = static_cast<MFace*>(mesh->mface);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
MTFace* tface = static_cast<MTFace*>(mesh->mtface);
|
2006-02-13 05:45:32 +00:00
|
|
|
|
|
|
|
MT_Vector3 *tan1 = new MT_Vector3[mesh->totvert];
|
|
|
|
MT_Vector3 *tan2 = new MT_Vector3[mesh->totvert];
|
|
|
|
|
|
|
|
unsigned int v;
|
|
|
|
for (v = 0; v < mesh->totvert; v++)
|
|
|
|
{
|
|
|
|
tan1[v] = MT_Vector3(0.0, 0.0, 0.0);
|
|
|
|
tan2[v] = MT_Vector3(0.0, 0.0, 0.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (unsigned int p = 0; p < mesh->totface; p++, mface++, tface++)
|
|
|
|
{
|
|
|
|
MT_Vector3 v1(mesh->mvert[mface->v1].co),
|
|
|
|
v2(mesh->mvert[mface->v2].co),
|
|
|
|
v3(mesh->mvert[mface->v3].co);
|
|
|
|
|
|
|
|
MT_Vector2 uv1(tface->uv[0]),
|
|
|
|
uv2(tface->uv[1]),
|
|
|
|
uv3(tface->uv[2]);
|
|
|
|
|
|
|
|
BL_ComputeTriTangentSpace(v1, v2, v3, uv1, uv2, uv3, mface, tan1, tan2);
|
|
|
|
if (mface->v4)
|
|
|
|
{
|
|
|
|
MT_Vector3 v4(mesh->mvert[mface->v4].co);
|
|
|
|
MT_Vector2 uv4(tface->uv[3]);
|
|
|
|
|
|
|
|
BL_ComputeTriTangentSpace(v1, v3, v4, uv1, uv3, uv4, mface, tan1, tan2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
MT_Vector4 *tangent = new MT_Vector4[mesh->totvert];
|
|
|
|
for (v = 0; v < mesh->totvert; v++)
|
|
|
|
{
|
|
|
|
const MT_Vector3 no(mesh->mvert[v].no[0]/32767.0,
|
|
|
|
mesh->mvert[v].no[1]/32767.0,
|
|
|
|
mesh->mvert[v].no[2]/32767.0);
|
|
|
|
// Gram-Schmidt orthogonalize
|
|
|
|
MT_Vector3 t(tan1[v] - no.cross(no.cross(tan1[v])));
|
|
|
|
if (!MT_fuzzyZero(t))
|
|
|
|
t /= t.length();
|
|
|
|
|
|
|
|
tangent[v].x() = t.x();
|
|
|
|
tangent[v].y() = t.y();
|
|
|
|
tangent[v].z() = t.z();
|
|
|
|
// Calculate handedness
|
|
|
|
tangent[v].w() = no.dot(tan1[v].cross(tan2[v])) < 0.0 ? -1.0 : 1.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
delete [] tan1;
|
|
|
|
delete [] tan2;
|
|
|
|
|
|
|
|
return tangent;
|
|
|
|
}
|
|
|
|
|
2004-04-24 06:40:15 +00:00
|
|
|
RAS_MeshObject* BL_ConvertMesh(Mesh* mesh, Object* blenderobj, RAS_IRenderTools* rendertools, KX_Scene* scene, KX_BlenderSceneConverter *converter)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
|
|
|
RAS_MeshObject *meshobj;
|
|
|
|
bool skinMesh = false;
|
|
|
|
|
|
|
|
int lightlayer = blenderobj->lay;
|
|
|
|
|
2005-01-22 23:46:54 +00:00
|
|
|
MFace* mface = static_cast<MFace*>(mesh->mface);
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
MTFace* tface = static_cast<MTFace*>(mesh->mtface);
|
2005-01-22 23:46:54 +00:00
|
|
|
MCol* mmcol = mesh->mcol;
|
|
|
|
MT_assert(mface || mesh->totface == 0);
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
// Determine if we need to make a skinned mesh
|
|
|
|
if (mesh->dvert){
|
|
|
|
meshobj = new BL_SkinMeshObject(lightlayer);
|
|
|
|
skinMesh = true;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
meshobj = new RAS_MeshObject(lightlayer);
|
|
|
|
}
|
2006-02-13 05:45:32 +00:00
|
|
|
MT_Vector4 *tangent = 0;
|
|
|
|
if (tface)
|
|
|
|
tangent = BL_ComputeMeshTangentSpace(mesh);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
meshobj->SetName(mesh->id.name);
|
|
|
|
|
|
|
|
meshobj->m_xyz_index_to_vertex_index_mapping.resize(mesh->totvert);
|
|
|
|
|
2004-05-16 12:52:08 +00:00
|
|
|
for (int f=0;f<mesh->totface;f++,mface++)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
|
|
|
|
|
|
|
bool collider = true;
|
|
|
|
|
|
|
|
// only add valid polygons
|
|
|
|
if (mface->v3)
|
|
|
|
{
|
|
|
|
MT_Point2 uv0(0.0,0.0),uv1(0.0,0.0),uv2(0.0,0.0),uv3(0.0,0.0);
|
|
|
|
// rgb3 is set from the adjoint face in a square
|
|
|
|
unsigned int rgb0,rgb1,rgb2,rgb3 = 0;
|
2004-06-23 01:12:11 +00:00
|
|
|
MT_Vector3 no0(mesh->mvert[mface->v1].no[0], mesh->mvert[mface->v1].no[1], mesh->mvert[mface->v1].no[2]),
|
|
|
|
no1(mesh->mvert[mface->v2].no[0], mesh->mvert[mface->v2].no[1], mesh->mvert[mface->v2].no[2]),
|
|
|
|
no2(mesh->mvert[mface->v3].no[0], mesh->mvert[mface->v3].no[1], mesh->mvert[mface->v3].no[2]),
|
|
|
|
no3(0.0, 0.0, 0.0);
|
|
|
|
MT_Point3 pt0(mesh->mvert[mface->v1].co),
|
|
|
|
pt1(mesh->mvert[mface->v2].co),
|
|
|
|
pt2(mesh->mvert[mface->v3].co),
|
|
|
|
pt3(0.0, 0.0, 0.0);
|
2006-02-13 05:45:32 +00:00
|
|
|
MT_Vector4 tan0(0.0, 0.0, 0.0, 0.0),
|
|
|
|
tan1(0.0, 0.0, 0.0, 0.0),
|
|
|
|
tan2(0.0, 0.0, 0.0, 0.0),
|
|
|
|
tan3(0.0, 0.0, 0.0, 0.0);
|
|
|
|
|
2004-06-23 01:12:11 +00:00
|
|
|
no0 /= 32767.0;
|
|
|
|
no1 /= 32767.0;
|
|
|
|
no2 /= 32767.0;
|
2002-10-12 11:37:38 +00:00
|
|
|
if (mface->v4)
|
|
|
|
{
|
2004-06-23 01:12:11 +00:00
|
|
|
pt3 = MT_Point3(mesh->mvert[mface->v4].co);
|
|
|
|
no3 = MT_Vector3(mesh->mvert[mface->v4].no[0], mesh->mvert[mface->v4].no[1], mesh->mvert[mface->v4].no[2]);
|
|
|
|
no3 /= 32767.0;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
2004-06-23 12:13:09 +00:00
|
|
|
if(!(mface->flag & ME_SMOOTH))
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
|
|
|
MT_Vector3 norm = ((pt1-pt0).cross(pt2-pt0)).safe_normalized();
|
|
|
|
norm[0] = ((int) (10*norm[0]))/10.0;
|
|
|
|
norm[1] = ((int) (10*norm[1]))/10.0;
|
|
|
|
norm[2] = ((int) (10*norm[2]))/10.0;
|
|
|
|
no0=no1=no2=no3= norm;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
2006-01-06 03:46:54 +00:00
|
|
|
Material* ma = 0;
|
2002-10-12 11:37:38 +00:00
|
|
|
bool polyvisible = true;
|
2006-01-06 03:46:54 +00:00
|
|
|
RAS_IPolyMaterial* polymat = NULL;
|
|
|
|
|
|
|
|
if(converter->GetMaterials())
|
|
|
|
{
|
|
|
|
if(mesh->totcol > 1)
|
|
|
|
ma = mesh->mat[mface->mat_nr];
|
|
|
|
else
|
|
|
|
ma = give_current_material(blenderobj, 1);
|
|
|
|
|
|
|
|
BL_Material *bl_mat = ConvertMaterial(mesh, ma, tface, mface, mmcol, lightlayer, blenderobj);
|
|
|
|
// set the index were dealing with
|
|
|
|
bl_mat->material_index = (int)mface->mat_nr;
|
|
|
|
|
|
|
|
polyvisible = ((bl_mat->ras_mode & POLY_VIS)!=0);
|
|
|
|
collider = ((bl_mat->ras_mode & COLLIDER)!=0);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-01-06 03:46:54 +00:00
|
|
|
polymat = new KX_BlenderMaterial(scene, bl_mat, skinMesh, lightlayer, blenderobj );
|
|
|
|
converter->RegisterBlenderMaterial(bl_mat);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-01-06 03:46:54 +00:00
|
|
|
unsigned int rgb[4];
|
|
|
|
bl_mat->GetConversionRGB(rgb);
|
|
|
|
rgb0 = rgb[0];
|
|
|
|
rgb1 = rgb[1];
|
|
|
|
rgb2 = rgb[2];
|
|
|
|
rgb3 = rgb[3];
|
|
|
|
MT_Point2 uv[4];
|
|
|
|
bl_mat->GetConversionUV(uv);
|
|
|
|
uv0 = uv[0];
|
|
|
|
uv1 = uv[1];
|
|
|
|
uv2 = uv[2];
|
|
|
|
uv3 = uv[3];
|
2006-02-13 05:45:32 +00:00
|
|
|
if(tangent){
|
|
|
|
tan0 = tangent[mface->v1];
|
|
|
|
tan1 = tangent[mface->v2];
|
|
|
|
tan2 = tangent[mface->v3];
|
|
|
|
if (mface->v4)
|
|
|
|
tan3 = tangent[mface->v4];
|
|
|
|
}
|
2006-01-06 03:46:54 +00:00
|
|
|
// this is needed to free up memory afterwards
|
|
|
|
converter->RegisterPolyMaterial(polymat);
|
|
|
|
}
|
2004-11-25 08:09:18 +00:00
|
|
|
else
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
2006-01-06 03:46:54 +00:00
|
|
|
ma = give_current_material(blenderobj, 1);
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
Image* bima = ((mesh->mtface && tface) ? (Image*) tface->tpage : NULL);
|
2006-01-06 03:46:54 +00:00
|
|
|
|
|
|
|
STR_String imastr =
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
((mesh->mtface && tface) ?
|
2006-01-06 03:46:54 +00:00
|
|
|
(bima? (bima)->id.name : "" ) : "" );
|
|
|
|
|
|
|
|
char transp=0;
|
|
|
|
short mode=0, tile=0;
|
|
|
|
int tilexrep=4,tileyrep = 4;
|
|
|
|
|
|
|
|
if (bima)
|
|
|
|
{
|
|
|
|
tilexrep = bima->xrep;
|
|
|
|
tileyrep = bima->yrep;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if (mesh->mtface && tface)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
2006-01-06 03:46:54 +00:00
|
|
|
// Use texface colors if available
|
|
|
|
//TF_DYNAMIC means the polygon is a collision face
|
|
|
|
collider = ((tface->mode & TF_DYNAMIC) != 0);
|
|
|
|
transp = tface->transp;
|
|
|
|
tile = tface->tile;
|
|
|
|
mode = tface->mode;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-01-06 03:46:54 +00:00
|
|
|
polyvisible = !((tface->flag & TF_HIDE)||(tface->mode & TF_INVISIBLE));
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-01-06 03:46:54 +00:00
|
|
|
uv0 = MT_Point2(tface->uv[0]);
|
|
|
|
uv1 = MT_Point2(tface->uv[1]);
|
|
|
|
uv2 = MT_Point2(tface->uv[2]);
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
if (mface->v4)
|
2006-01-06 03:46:54 +00:00
|
|
|
uv3 = MT_Point2(tface->uv[3]);
|
|
|
|
}
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if (mmcol)
|
2004-11-25 08:09:18 +00:00
|
|
|
{
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
// Use vertex colours
|
|
|
|
rgb0 = KX_Mcol2uint_new(mmcol[0]);
|
|
|
|
rgb1 = KX_Mcol2uint_new(mmcol[1]);
|
|
|
|
rgb2 = KX_Mcol2uint_new(mmcol[2]);
|
2006-01-06 03:46:54 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if (mface->v4)
|
|
|
|
rgb3 = KX_Mcol2uint_new(mmcol[3]);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// If there are no vertex colors OR texfaces,
|
|
|
|
// Initialize face to white and set COLLSION true and everything else FALSE
|
|
|
|
unsigned int colour = 0xFFFFFFFFL;
|
|
|
|
mode = default_face_mode;
|
|
|
|
transp = TF_SOLID;
|
|
|
|
tile = 0;
|
|
|
|
if (ma)
|
2006-01-06 03:46:54 +00:00
|
|
|
{
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
// If we have a material, take the default colour from the material.
|
|
|
|
union
|
2006-01-06 03:46:54 +00:00
|
|
|
{
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
unsigned char cp[4];
|
|
|
|
unsigned int integer;
|
|
|
|
} col_converter;
|
2004-11-25 08:09:18 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
col_converter.cp[3] = (unsigned char) (ma->r*255.0);
|
|
|
|
col_converter.cp[2] = (unsigned char) (ma->g*255.0);
|
|
|
|
col_converter.cp[1] = (unsigned char) (ma->b*255.0);
|
|
|
|
col_converter.cp[0] = (unsigned char) (ma->alpha*255.0);
|
2004-11-25 08:09:18 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
colour = col_converter.integer;
|
2004-11-25 08:09:18 +00:00
|
|
|
}
|
2006-01-06 03:46:54 +00:00
|
|
|
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
rgb0 = KX_rgbaint2uint_new(colour);
|
|
|
|
rgb1 = KX_rgbaint2uint_new(colour);
|
|
|
|
rgb2 = KX_rgbaint2uint_new(colour);
|
|
|
|
|
|
|
|
if (mface->v4)
|
|
|
|
rgb3 = KX_rgbaint2uint_new(colour);
|
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-01-06 03:46:54 +00:00
|
|
|
bool istriangle = (mface->v4==0);
|
|
|
|
bool zsort = ma?(ma->mode & MA_ZTRA) != 0:false;
|
|
|
|
|
|
|
|
polymat = new KX_PolygonMaterial(imastr, ma,
|
|
|
|
tile, tilexrep, tileyrep,
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
mode, transp, zsort, lightlayer, istriangle, blenderobj, tface, (unsigned int*)mmcol);
|
2006-01-06 03:46:54 +00:00
|
|
|
|
|
|
|
if (ma)
|
|
|
|
{
|
|
|
|
polymat->m_specular = MT_Vector3(ma->specr, ma->specg, ma->specb)*ma->spec;
|
|
|
|
polymat->m_shininess = (float)ma->har/4.0; // 0 < ma->har <= 512
|
|
|
|
polymat->m_diffuse = MT_Vector3(ma->r, ma->g, ma->b)*(ma->emit + ma->ref);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-01-06 03:46:54 +00:00
|
|
|
} else
|
|
|
|
{
|
|
|
|
polymat->m_specular = MT_Vector3(0.0f,0.0f,0.0f);
|
|
|
|
polymat->m_shininess = 35.0;
|
|
|
|
}
|
|
|
|
// this is needed to free up memory afterwards
|
|
|
|
converter->RegisterPolyMaterial(polymat);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-01-06 03:46:54 +00:00
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
RAS_MaterialBucket* bucket = scene->FindBucket(polymat);
|
|
|
|
|
|
|
|
int nverts = mface->v4?4:3;
|
|
|
|
int vtxarray = meshobj->FindVertexArray(nverts,polymat);
|
|
|
|
RAS_Polygon* poly = new RAS_Polygon(bucket,polyvisible,nverts,vtxarray);
|
|
|
|
if (skinMesh) {
|
2005-03-09 19:45:59 +00:00
|
|
|
int d1, d2, d3, d4=0;
|
2002-10-12 11:37:38 +00:00
|
|
|
bool flat;
|
|
|
|
|
|
|
|
/* If the face is set to solid, all fnors are the same */
|
|
|
|
if (mface->flag & ME_SMOOTH)
|
|
|
|
flat = false;
|
|
|
|
else
|
|
|
|
flat = true;
|
|
|
|
|
|
|
|
d1=((BL_SkinMeshObject*)meshobj)->FindOrAddDeform(vtxarray, mface->v1, &mesh->dvert[mface->v1], polymat);
|
|
|
|
d2=((BL_SkinMeshObject*)meshobj)->FindOrAddDeform(vtxarray, mface->v2, &mesh->dvert[mface->v2], polymat);
|
|
|
|
d3=((BL_SkinMeshObject*)meshobj)->FindOrAddDeform(vtxarray, mface->v3, &mesh->dvert[mface->v3], polymat);
|
|
|
|
if (nverts==4)
|
|
|
|
d4=((BL_SkinMeshObject*)meshobj)->FindOrAddDeform(vtxarray, mface->v4, &mesh->dvert[mface->v4], polymat);
|
2006-02-13 05:45:32 +00:00
|
|
|
poly->SetVertex(0,((BL_SkinMeshObject*)meshobj)->FindOrAddVertex(vtxarray,pt0,uv0,tan0,rgb0,no0,d1,flat, polymat));
|
|
|
|
poly->SetVertex(1,((BL_SkinMeshObject*)meshobj)->FindOrAddVertex(vtxarray,pt1,uv1,tan1,rgb1,no1,d2,flat, polymat));
|
|
|
|
poly->SetVertex(2,((BL_SkinMeshObject*)meshobj)->FindOrAddVertex(vtxarray,pt2,uv2,tan2,rgb2,no2,d3,flat, polymat));
|
2002-10-12 11:37:38 +00:00
|
|
|
if (nverts==4)
|
2006-02-13 05:45:32 +00:00
|
|
|
poly->SetVertex(3,((BL_SkinMeshObject*)meshobj)->FindOrAddVertex(vtxarray,pt3,uv3,tan3,rgb3,no3,d4, flat,polymat));
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2006-02-13 05:45:32 +00:00
|
|
|
poly->SetVertex(0,meshobj->FindOrAddVertex(vtxarray,pt0,uv0,tan0,rgb0,no0,polymat,mface->v1));
|
|
|
|
poly->SetVertex(1,meshobj->FindOrAddVertex(vtxarray,pt1,uv1,tan1,rgb1,no1,polymat,mface->v2));
|
|
|
|
poly->SetVertex(2,meshobj->FindOrAddVertex(vtxarray,pt2,uv2,tan2,rgb2,no2,polymat,mface->v3));
|
2002-10-12 11:37:38 +00:00
|
|
|
if (nverts==4)
|
2006-02-13 05:45:32 +00:00
|
|
|
poly->SetVertex(3,meshobj->FindOrAddVertex(vtxarray,pt3,uv3,tan3,rgb3,no3,polymat,mface->v4));
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
meshobj->AddPolygon(poly);
|
|
|
|
if (poly->IsCollider())
|
|
|
|
{
|
|
|
|
RAS_TriangleIndex idx;
|
|
|
|
idx.m_index[0] = mface->v1;
|
|
|
|
idx.m_index[1] = mface->v2;
|
|
|
|
idx.m_index[2] = mface->v3;
|
|
|
|
idx.m_collider = collider;
|
|
|
|
meshobj->m_triangle_indices.push_back(idx);
|
|
|
|
if (nverts==4)
|
|
|
|
{
|
|
|
|
idx.m_index[0] = mface->v1;
|
|
|
|
idx.m_index[1] = mface->v3;
|
|
|
|
idx.m_index[2] = mface->v4;
|
|
|
|
idx.m_collider = collider;
|
|
|
|
meshobj->m_triangle_indices.push_back(idx);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-08-21 14:39:08 +00:00
|
|
|
// poly->SetVisibleWireframeEdges(mface->edcode);
|
2002-10-12 11:37:38 +00:00
|
|
|
poly->SetCollider(collider);
|
|
|
|
}
|
|
|
|
}
|
2004-05-16 12:52:08 +00:00
|
|
|
if (tface)
|
|
|
|
tface++;
|
Added custom vertex/edge/face data for meshes:
All data layers, including MVert/MEdge/MFace, are now managed as custom
data layers. The pointers like Mesh.mvert, Mesh.dvert or Mesh.mcol are
still used of course, but allocating, copying or freeing these arrays
should be done through the CustomData API.
Work in progress documentation on this is here:
http://mediawiki.blender.org/index.php/BlenderDev/BlenderArchitecture/CustomData
Replaced TFace by MTFace:
This is the same struct, except that it does not contain color, that now
always stays separated in MCol. This was not a good design decision to
begin with, and it is needed for adding multiple color layers later. Note
that this does mean older Blender versions will not be able to read UV
coordinates from the next release, due to an SDNA limitation.
Removed DispListMesh:
This now fully replaced by DerivedMesh. To provide access to arrays of
vertices, edges and faces, like DispListMesh does. The semantics of the
DerivedMesh.getVertArray() and similar functions were changed to return
a pointer to an array if one exists, or otherwise allocate a temporary
one. On releasing the DerivedMesh, this temporary array will be removed
automatically.
Removed ssDM and meshDM DerivedMesh backends:
The ssDM backend was for DispListMesh, so that became obsolete automatically.
The meshDM backend was replaced by the custom data backend, that now figures
out which layers need to be modified, and only duplicates those.
This changes code in many places, and overall removes 2514 lines of code.
So, there's a good chance this might break some stuff, although I've been
testing it for a few days now. The good news is, adding multiple color and
uv layers should now become easy.
2006-11-20 04:28:02 +00:00
|
|
|
if (mmcol)
|
|
|
|
mmcol+=4;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
meshobj->UpdateMaterialList();
|
2006-01-06 03:46:54 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// -----------------------------------
|
|
|
|
// pre calculate texture generation
|
2006-01-15 11:34:55 +00:00
|
|
|
for(RAS_MaterialBucket::Set::iterator mit = meshobj->GetFirstMaterial();
|
|
|
|
mit != meshobj->GetLastMaterial(); ++ mit) {
|
|
|
|
(*mit)->GetPolyMaterial()->OnConstruction();
|
|
|
|
}
|
2006-02-13 05:45:32 +00:00
|
|
|
|
|
|
|
if(tangent)
|
|
|
|
delete [] tangent;
|
2006-01-06 03:46:54 +00:00
|
|
|
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
return meshobj;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static PHY_MaterialProps *CreateMaterialFromBlenderObject(struct Object* blenderobject,
|
|
|
|
KX_Scene *kxscene)
|
|
|
|
{
|
|
|
|
PHY_MaterialProps *materialProps = new PHY_MaterialProps;
|
|
|
|
|
2005-01-16 06:02:06 +00:00
|
|
|
MT_assert(materialProps && "Create physics material properties failed");
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
Material* blendermat = give_current_material(blenderobject, 0);
|
|
|
|
|
|
|
|
if (blendermat)
|
|
|
|
{
|
2005-01-16 06:02:06 +00:00
|
|
|
MT_assert(0.0f <= blendermat->reflect && blendermat->reflect <= 1.0f);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
materialProps->m_restitution = blendermat->reflect;
|
|
|
|
materialProps->m_friction = blendermat->friction;
|
|
|
|
materialProps->m_fh_spring = blendermat->fh;
|
|
|
|
materialProps->m_fh_damping = blendermat->xyfrict;
|
|
|
|
materialProps->m_fh_distance = blendermat->fhdist;
|
|
|
|
materialProps->m_fh_normal = (blendermat->dynamode & MA_FH_NOR) != 0;
|
|
|
|
}
|
|
|
|
else {
|
2006-04-17 01:33:10 +00:00
|
|
|
//give some defaults
|
|
|
|
materialProps->m_restitution = 0.f;
|
|
|
|
materialProps->m_friction = 0.5;
|
|
|
|
materialProps->m_fh_spring = 0.f;
|
|
|
|
materialProps->m_fh_damping = 0.f;
|
|
|
|
materialProps->m_fh_distance = 0.f;
|
|
|
|
materialProps->m_fh_normal = false;
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return materialProps;
|
|
|
|
}
|
|
|
|
|
|
|
|
static PHY_ShapeProps *CreateShapePropsFromBlenderObject(struct Object* blenderobject,
|
|
|
|
KX_Scene *kxscene)
|
|
|
|
{
|
|
|
|
PHY_ShapeProps *shapeProps = new PHY_ShapeProps;
|
|
|
|
|
2005-01-16 06:02:06 +00:00
|
|
|
MT_assert(shapeProps);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
shapeProps->m_mass = blenderobject->mass;
|
|
|
|
|
|
|
|
// This needs to be fixed in blender. For now, we use:
|
|
|
|
|
|
|
|
// in Blender, inertia stands for the size value which is equivalent to
|
|
|
|
// the sphere radius
|
2004-04-16 06:26:33 +00:00
|
|
|
shapeProps->m_inertia = blenderobject->formfactor;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2005-01-16 06:02:06 +00:00
|
|
|
MT_assert(0.0f <= blenderobject->damping && blenderobject->damping <= 1.0f);
|
|
|
|
MT_assert(0.0f <= blenderobject->rdamping && blenderobject->rdamping <= 1.0f);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
shapeProps->m_lin_drag = 1.0 - blenderobject->damping;
|
|
|
|
shapeProps->m_ang_drag = 1.0 - blenderobject->rdamping;
|
|
|
|
|
|
|
|
shapeProps->m_friction_scaling[0] = blenderobject->anisotropicFriction[0];
|
|
|
|
shapeProps->m_friction_scaling[1] = blenderobject->anisotropicFriction[1];
|
|
|
|
shapeProps->m_friction_scaling[2] = blenderobject->anisotropicFriction[2];
|
|
|
|
shapeProps->m_do_anisotropic = ((blenderobject->gameflag & OB_ANISOTROPIC_FRICTION) != 0);
|
|
|
|
|
|
|
|
shapeProps->m_do_fh = (blenderobject->gameflag & OB_DO_FH) != 0;
|
|
|
|
shapeProps->m_do_rot_fh = (blenderobject->gameflag & OB_ROT_FH) != 0;
|
|
|
|
|
|
|
|
return shapeProps;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
2004-07-16 00:08:06 +00:00
|
|
|
static float my_boundbox_mesh(Mesh *me, float *loc, float *size)
|
2004-05-21 09:21:15 +00:00
|
|
|
{
|
2002-10-12 11:37:38 +00:00
|
|
|
MVert *mvert;
|
|
|
|
BoundBox *bb;
|
2004-05-21 09:21:15 +00:00
|
|
|
MT_Point3 min, max;
|
2002-10-12 11:37:38 +00:00
|
|
|
float mloc[3], msize[3];
|
|
|
|
int a;
|
|
|
|
|
|
|
|
if(me->bb==0) me->bb= (struct BoundBox *)MEM_callocN(sizeof(BoundBox), "boundbox");
|
|
|
|
bb= me->bb;
|
|
|
|
|
|
|
|
INIT_MINMAX(min, max);
|
|
|
|
|
|
|
|
if (!loc) loc= mloc;
|
|
|
|
if (!size) size= msize;
|
|
|
|
|
|
|
|
mvert= me->mvert;
|
|
|
|
for(a=0; a<me->totvert; a++, mvert++) {
|
|
|
|
DO_MINMAX(mvert->co, min, max);
|
2004-05-21 09:21:15 +00:00
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
if(me->totvert) {
|
|
|
|
loc[0]= (min[0]+max[0])/2.0;
|
|
|
|
loc[1]= (min[1]+max[1])/2.0;
|
|
|
|
loc[2]= (min[2]+max[2])/2.0;
|
|
|
|
|
|
|
|
size[0]= (max[0]-min[0])/2.0;
|
|
|
|
size[1]= (max[1]-min[1])/2.0;
|
|
|
|
size[2]= (max[2]-min[2])/2.0;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
loc[0]= loc[1]= loc[2]= 0.0;
|
|
|
|
size[0]= size[1]= size[2]= 0.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
bb->vec[0][0]=bb->vec[1][0]=bb->vec[2][0]=bb->vec[3][0]= loc[0]-size[0];
|
|
|
|
bb->vec[4][0]=bb->vec[5][0]=bb->vec[6][0]=bb->vec[7][0]= loc[0]+size[0];
|
|
|
|
|
|
|
|
bb->vec[0][1]=bb->vec[1][1]=bb->vec[4][1]=bb->vec[5][1]= loc[1]-size[1];
|
|
|
|
bb->vec[2][1]=bb->vec[3][1]=bb->vec[6][1]=bb->vec[7][1]= loc[1]+size[1];
|
|
|
|
|
|
|
|
bb->vec[0][2]=bb->vec[3][2]=bb->vec[4][2]=bb->vec[7][2]= loc[2]-size[2];
|
|
|
|
bb->vec[1][2]=bb->vec[2][2]=bb->vec[5][2]=bb->vec[6][2]= loc[2]+size[2];
|
2004-05-21 09:21:15 +00:00
|
|
|
|
|
|
|
float radius = 0;
|
|
|
|
for (a=0, mvert = me->mvert; a < me->totvert; a++, mvert++)
|
|
|
|
{
|
|
|
|
float vert_radius = MT_Vector3(mvert->co).length2();
|
|
|
|
if (vert_radius > radius)
|
|
|
|
radius = vert_radius;
|
|
|
|
}
|
|
|
|
return sqrt(radius);
|
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2004-07-16 00:08:06 +00:00
|
|
|
static void my_tex_space_mesh(Mesh *me)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
|
|
|
KeyBlock *kb;
|
|
|
|
float *fp, loc[3], size[3], min[3], max[3];
|
|
|
|
int a;
|
|
|
|
|
|
|
|
my_boundbox_mesh(me, loc, size);
|
|
|
|
|
2004-03-22 22:02:18 +00:00
|
|
|
if(me->texflag & AUTOSPACE) {
|
2002-10-12 11:37:38 +00:00
|
|
|
if(me->key) {
|
|
|
|
kb= me->key->refkey;
|
|
|
|
if (kb) {
|
|
|
|
|
|
|
|
INIT_MINMAX(min, max);
|
|
|
|
|
|
|
|
fp= (float *)kb->data;
|
|
|
|
for(a=0; a<kb->totelem; a++, fp+=3) {
|
|
|
|
DO_MINMAX(fp, min, max);
|
|
|
|
}
|
|
|
|
if(kb->totelem) {
|
|
|
|
loc[0]= (min[0]+max[0])/2.0; loc[1]= (min[1]+max[1])/2.0; loc[2]= (min[2]+max[2])/2.0;
|
|
|
|
size[0]= (max[0]-min[0])/2.0; size[1]= (max[1]-min[1])/2.0; size[2]= (max[2]-min[2])/2.0;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
loc[0]= loc[1]= loc[2]= 0.0;
|
|
|
|
size[0]= size[1]= size[2]= 0.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
VECCOPY(me->loc, loc);
|
|
|
|
VECCOPY(me->size, size);
|
|
|
|
me->rot[0]= me->rot[1]= me->rot[2]= 0.0;
|
|
|
|
|
|
|
|
if(me->size[0]==0.0) me->size[0]= 1.0;
|
|
|
|
else if(me->size[0]>0.0 && me->size[0]<0.00001) me->size[0]= 0.00001;
|
|
|
|
else if(me->size[0]<0.0 && me->size[0]> -0.00001) me->size[0]= -0.00001;
|
|
|
|
|
|
|
|
if(me->size[1]==0.0) me->size[1]= 1.0;
|
|
|
|
else if(me->size[1]>0.0 && me->size[1]<0.00001) me->size[1]= 0.00001;
|
|
|
|
else if(me->size[1]<0.0 && me->size[1]> -0.00001) me->size[1]= -0.00001;
|
|
|
|
|
|
|
|
if(me->size[2]==0.0) me->size[2]= 1.0;
|
|
|
|
else if(me->size[2]>0.0 && me->size[2]<0.00001) me->size[2]= 0.00001;
|
|
|
|
else if(me->size[2]<0.0 && me->size[2]> -0.00001) me->size[2]= -0.00001;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2004-07-16 00:08:06 +00:00
|
|
|
static void my_get_local_bounds(Object *ob, float *centre, float *size)
|
2004-05-16 12:52:08 +00:00
|
|
|
{
|
2002-10-12 11:37:38 +00:00
|
|
|
BoundBox *bb= NULL;
|
|
|
|
/* uses boundbox, function used by Ketsji */
|
2004-07-16 00:08:06 +00:00
|
|
|
switch (ob->type)
|
|
|
|
{
|
|
|
|
case OB_MESH:
|
2002-10-12 11:37:38 +00:00
|
|
|
bb= ( (Mesh *)ob->data )->bb;
|
2004-07-16 00:08:06 +00:00
|
|
|
if(bb==0)
|
|
|
|
{
|
|
|
|
my_tex_space_mesh((struct Mesh *)ob->data);
|
|
|
|
bb= ( (Mesh *)ob->data )->bb;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OB_CURVE:
|
|
|
|
case OB_SURF:
|
|
|
|
case OB_FONT:
|
|
|
|
centre[0]= centre[1]= centre[2]= 0.0;
|
|
|
|
size[0] = size[1]=size[2]=0.0;
|
|
|
|
break;
|
|
|
|
case OB_MBALL:
|
|
|
|
bb= ob->bb;
|
|
|
|
break;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
2004-07-16 00:08:06 +00:00
|
|
|
|
|
|
|
if(bb==NULL)
|
|
|
|
{
|
2002-10-12 11:37:38 +00:00
|
|
|
centre[0]= centre[1]= centre[2]= 0.0;
|
2004-07-16 00:08:06 +00:00
|
|
|
size[0] = size[1]=size[2]=1.0;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
2004-07-16 00:08:06 +00:00
|
|
|
else
|
|
|
|
{
|
2002-10-12 11:37:38 +00:00
|
|
|
size[0]= 0.5*fabs(bb->vec[0][0] - bb->vec[4][0]);
|
|
|
|
size[1]= 0.5*fabs(bb->vec[0][1] - bb->vec[2][1]);
|
|
|
|
size[2]= 0.5*fabs(bb->vec[0][2] - bb->vec[1][2]);
|
|
|
|
|
2004-03-22 22:02:18 +00:00
|
|
|
centre[0]= 0.5*(bb->vec[0][0] + bb->vec[4][0]);
|
|
|
|
centre[1]= 0.5*(bb->vec[0][1] + bb->vec[2][1]);
|
|
|
|
centre[2]= 0.5*(bb->vec[0][2] + bb->vec[1][2]);
|
2004-07-16 00:08:06 +00:00
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj,
|
|
|
|
struct Object* blenderobject,
|
|
|
|
RAS_MeshObject* meshobj,
|
|
|
|
KX_Scene* kxscene,
|
|
|
|
int activeLayerBitInfo,
|
|
|
|
e_PhysicsEngine physics_engine,
|
2006-12-01 01:04:27 +00:00
|
|
|
KX_BlenderSceneConverter *converter,
|
|
|
|
bool processCompoundChildren
|
2002-10-12 11:37:38 +00:00
|
|
|
)
|
|
|
|
|
2004-04-24 06:40:15 +00:00
|
|
|
{
|
2005-03-09 19:45:59 +00:00
|
|
|
//SYS_SystemHandle syshandle = SYS_GetSystem(); /*unused*/
|
2002-10-12 11:37:38 +00:00
|
|
|
//int userigidbody = SYS_GetCommandLineInt(syshandle,"norigidbody",0);
|
|
|
|
//bool bRigidBody = (userigidbody == 0);
|
|
|
|
|
2006-12-01 01:04:27 +00:00
|
|
|
// get Root Parent of blenderobject
|
|
|
|
struct Object* parent= blenderobject->parent;
|
|
|
|
while(parent && parent->parent) {
|
|
|
|
parent= parent->parent;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool isCompoundChild = false;
|
|
|
|
|
|
|
|
if (parent && (parent->gameflag & OB_DYNAMIC)) {
|
|
|
|
|
|
|
|
if ((parent->gameflag & OB_CHILD) != 0)
|
|
|
|
{
|
|
|
|
isCompoundChild = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (processCompoundChildren != isCompoundChild)
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
PHY_ShapeProps* shapeprops =
|
|
|
|
CreateShapePropsFromBlenderObject(blenderobject,
|
|
|
|
kxscene);
|
|
|
|
|
|
|
|
|
|
|
|
PHY_MaterialProps* smmaterial =
|
|
|
|
CreateMaterialFromBlenderObject(blenderobject, kxscene);
|
|
|
|
|
|
|
|
KX_ObjectProperties objprop;
|
2006-12-01 01:04:27 +00:00
|
|
|
|
|
|
|
objprop.m_isCompoundChild = isCompoundChild;
|
|
|
|
objprop.m_hasCompoundChildren = (blenderobject->gameflag & OB_CHILD) != 0;
|
|
|
|
|
2004-05-26 12:01:08 +00:00
|
|
|
if ((objprop.m_isactor = (blenderobject->gameflag & OB_ACTOR)!=0))
|
|
|
|
{
|
|
|
|
objprop.m_dyna = (blenderobject->gameflag & OB_DYNAMIC) != 0;
|
|
|
|
objprop.m_angular_rigidbody = (blenderobject->gameflag & OB_RIGID_BODY) != 0;
|
|
|
|
objprop.m_ghost = (blenderobject->gameflag & OB_GHOST) != 0;
|
2006-02-22 06:58:05 +00:00
|
|
|
objprop.m_disableSleeping = (blenderobject->gameflag & OB_COLLISION_RESPONSE) != 0;//abuse the OB_COLLISION_RESPONSE flag
|
2004-05-26 12:01:08 +00:00
|
|
|
} else {
|
|
|
|
objprop.m_dyna = false;
|
|
|
|
objprop.m_angular_rigidbody = false;
|
|
|
|
objprop.m_ghost = false;
|
2006-02-22 06:58:05 +00:00
|
|
|
objprop.m_disableSleeping = false;
|
2004-05-26 12:01:08 +00:00
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
//mmm, for now, taks this for the size of the dynamicobject
|
|
|
|
// Blender uses inertia for radius of dynamic object
|
|
|
|
objprop.m_radius = blenderobject->inertia;
|
|
|
|
objprop.m_in_active_layer = (blenderobject->lay & activeLayerBitInfo) != 0;
|
|
|
|
objprop.m_dynamic_parent=NULL;
|
|
|
|
objprop.m_isdeformable = ((blenderobject->gameflag2 & 2)) != 0;
|
2004-03-22 22:02:18 +00:00
|
|
|
objprop.m_boundclass = objprop.m_dyna?KX_BOUNDSPHERE:KX_BOUNDMESH;
|
|
|
|
KX_BoxBounds bb;
|
|
|
|
my_get_local_bounds(blenderobject,objprop.m_boundobject.box.m_center,bb.m_extends);
|
|
|
|
if (blenderobject->gameflag & OB_BOUNDS)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
2004-03-22 22:02:18 +00:00
|
|
|
switch (blenderobject->boundtype)
|
|
|
|
{
|
|
|
|
case OB_BOUND_BOX:
|
|
|
|
objprop.m_boundclass = KX_BOUNDBOX;
|
|
|
|
//mmm, has to be divided by 2 to be proper extends
|
|
|
|
objprop.m_boundobject.box.m_extends[0]=2.f*bb.m_extends[0];
|
|
|
|
objprop.m_boundobject.box.m_extends[1]=2.f*bb.m_extends[1];
|
|
|
|
objprop.m_boundobject.box.m_extends[2]=2.f*bb.m_extends[2];
|
|
|
|
break;
|
2004-11-22 10:19:19 +00:00
|
|
|
case OB_BOUND_POLYT:
|
|
|
|
if (blenderobject->type == OB_MESH)
|
|
|
|
{
|
|
|
|
objprop.m_boundclass = KX_BOUNDPOLYTOPE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
// Object is not a mesh... fall through OB_BOUND_POLYH to
|
|
|
|
// OB_BOUND_SPHERE
|
2004-07-16 00:08:06 +00:00
|
|
|
case OB_BOUND_POLYH:
|
|
|
|
if (blenderobject->type == OB_MESH)
|
|
|
|
{
|
|
|
|
objprop.m_boundclass = KX_BOUNDMESH;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
// Object is not a mesh... can't use polyheder.
|
|
|
|
// Fall through and become a sphere.
|
2004-03-22 22:02:18 +00:00
|
|
|
case OB_BOUND_SPHERE:
|
|
|
|
{
|
|
|
|
objprop.m_boundclass = KX_BOUNDSPHERE;
|
|
|
|
objprop.m_boundobject.c.m_radius = MT_max(bb.m_extends[0], MT_max(bb.m_extends[1], bb.m_extends[2]));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case OB_BOUND_CYLINDER:
|
|
|
|
{
|
|
|
|
objprop.m_boundclass = KX_BOUNDCYLINDER;
|
|
|
|
objprop.m_boundobject.c.m_radius = MT_max(bb.m_extends[0], bb.m_extends[1]);
|
|
|
|
objprop.m_boundobject.c.m_height = 2.f*bb.m_extends[2];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case OB_BOUND_CONE:
|
|
|
|
{
|
|
|
|
objprop.m_boundclass = KX_BOUNDCONE;
|
|
|
|
objprop.m_boundobject.c.m_radius = MT_max(bb.m_extends[0], bb.m_extends[1]);
|
|
|
|
objprop.m_boundobject.c.m_height = 2.f*bb.m_extends[2];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
2006-12-01 01:04:27 +00:00
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
if (parent && (parent->gameflag & OB_DYNAMIC)) {
|
|
|
|
|
|
|
|
KX_GameObject *parentgameobject = converter->FindGameObject(parent);
|
|
|
|
objprop.m_dynamic_parent = parentgameobject;
|
2006-12-01 01:04:27 +00:00
|
|
|
//cannot be dynamic:
|
|
|
|
objprop.m_dyna = false;
|
|
|
|
shapeprops->m_mass = 0.f;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
2006-12-01 01:04:27 +00:00
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
objprop.m_concave = (blenderobject->boundtype & 4) != 0;
|
|
|
|
|
|
|
|
switch (physics_engine)
|
2004-04-24 06:40:15 +00:00
|
|
|
{
|
2005-07-16 21:47:54 +00:00
|
|
|
#ifdef USE_BULLET
|
|
|
|
case UseBullet:
|
|
|
|
KX_ConvertBulletObject(gameobj, meshobj, kxscene, shapeprops, smmaterial, &objprop);
|
|
|
|
break;
|
|
|
|
|
|
|
|
#endif
|
2002-10-12 11:37:38 +00:00
|
|
|
#ifdef USE_SUMO_SOLID
|
2004-04-24 06:40:15 +00:00
|
|
|
case UseSumo:
|
|
|
|
KX_ConvertSumoObject(gameobj, meshobj, kxscene, shapeprops, smmaterial, &objprop);
|
|
|
|
break;
|
2002-10-12 11:37:38 +00:00
|
|
|
#endif
|
2004-04-24 06:40:15 +00:00
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
#ifdef USE_ODE
|
2004-04-24 06:40:15 +00:00
|
|
|
case UseODE:
|
|
|
|
KX_ConvertODEEngineObject(gameobj, meshobj, kxscene, shapeprops, smmaterial, &objprop);
|
|
|
|
break;
|
2002-10-12 11:37:38 +00:00
|
|
|
#endif //USE_ODE
|
|
|
|
|
2004-04-24 06:40:15 +00:00
|
|
|
case UseDynamo:
|
|
|
|
//KX_ConvertDynamoObject(gameobj,meshobj,kxscene,shapeprops, smmaterial, &objprop);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case UseNone:
|
|
|
|
default:
|
|
|
|
break;
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static KX_LightObject *gamelight_from_blamp(Lamp *la, unsigned int layerflag, KX_Scene *kxscene, RAS_IRenderTools *rendertools, KX_BlenderSceneConverter *converter) {
|
|
|
|
RAS_LightObject lightobj;
|
|
|
|
KX_LightObject *gamelight;
|
|
|
|
|
|
|
|
lightobj.m_att1 = la->att1;
|
2004-06-07 11:01:31 +00:00
|
|
|
lightobj.m_att2 = (la->mode & LA_QUAD)?la->att2:0.0;
|
2002-10-12 11:37:38 +00:00
|
|
|
lightobj.m_red = la->r;
|
|
|
|
lightobj.m_green = la->g;
|
|
|
|
lightobj.m_blue = la->b;
|
|
|
|
lightobj.m_distance = la->dist;
|
|
|
|
lightobj.m_energy = la->energy;
|
|
|
|
lightobj.m_layer = layerflag;
|
|
|
|
lightobj.m_spotblend = la->spotblend;
|
|
|
|
lightobj.m_spotsize = la->spotsize;
|
|
|
|
|
2004-06-07 11:01:31 +00:00
|
|
|
lightobj.m_nodiffuse = (la->mode & LA_NO_DIFF) != 0;
|
|
|
|
lightobj.m_nospecular = (la->mode & LA_NO_SPEC) != 0;
|
|
|
|
|
|
|
|
if (la->mode & LA_NEG)
|
|
|
|
{
|
|
|
|
lightobj.m_red = -lightobj.m_red;
|
|
|
|
lightobj.m_green = -lightobj.m_green;
|
|
|
|
lightobj.m_blue = -lightobj.m_blue;
|
|
|
|
}
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
if (la->type==LA_SUN) {
|
|
|
|
lightobj.m_type = RAS_LightObject::LIGHT_SUN;
|
|
|
|
} else if (la->type==LA_SPOT) {
|
|
|
|
lightobj.m_type = RAS_LightObject::LIGHT_SPOT;
|
|
|
|
} else {
|
|
|
|
lightobj.m_type = RAS_LightObject::LIGHT_NORMAL;
|
|
|
|
}
|
|
|
|
|
|
|
|
gamelight = new KX_LightObject(kxscene, KX_Scene::m_callbacks, rendertools, lightobj);
|
|
|
|
BL_ConvertLampIpos(la, gamelight, converter);
|
|
|
|
|
|
|
|
return gamelight;
|
|
|
|
}
|
|
|
|
|
|
|
|
static KX_Camera *gamecamera_from_bcamera(Camera *ca, KX_Scene *kxscene, KX_BlenderSceneConverter *converter) {
|
2004-04-11 02:50:02 +00:00
|
|
|
RAS_CameraData camdata(ca->lens, ca->clipsta, ca->clipend, ca->type == CAM_PERSP);
|
2002-10-12 11:37:38 +00:00
|
|
|
KX_Camera *gamecamera;
|
|
|
|
|
|
|
|
gamecamera= new KX_Camera(kxscene, KX_Scene::m_callbacks, camdata);
|
|
|
|
gamecamera->SetName(ca->id.name + 2);
|
|
|
|
|
|
|
|
BL_ConvertCameraIpos(ca, gamecamera, converter);
|
|
|
|
|
|
|
|
return gamecamera;
|
|
|
|
}
|
|
|
|
|
|
|
|
static KX_GameObject *gameobject_from_blenderobject(
|
|
|
|
Object *ob,
|
|
|
|
KX_Scene *kxscene,
|
|
|
|
RAS_IRenderTools *rendertools,
|
|
|
|
KX_BlenderSceneConverter *converter,
|
|
|
|
Scene *blenderscene)
|
|
|
|
{
|
|
|
|
KX_GameObject *gameobj = NULL;
|
|
|
|
|
|
|
|
switch(ob->type)
|
|
|
|
{
|
|
|
|
case OB_LAMP:
|
|
|
|
{
|
|
|
|
KX_LightObject* gamelight= gamelight_from_blamp(static_cast<Lamp*>(ob->data), ob->lay, kxscene, rendertools, converter);
|
|
|
|
gameobj = gamelight;
|
|
|
|
|
|
|
|
gamelight->AddRef();
|
|
|
|
kxscene->GetLightList()->Add(gamelight);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case OB_CAMERA:
|
|
|
|
{
|
|
|
|
KX_Camera* gamecamera = gamecamera_from_bcamera(static_cast<Camera*>(ob->data), kxscene, converter);
|
|
|
|
gameobj = gamecamera;
|
|
|
|
|
|
|
|
gamecamera->AddRef();
|
|
|
|
kxscene->AddCamera(gamecamera);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case OB_MESH:
|
|
|
|
{
|
|
|
|
Mesh* mesh = static_cast<Mesh*>(ob->data);
|
|
|
|
RAS_MeshObject* meshobj = converter->FindGameMesh(mesh, ob->lay);
|
2004-05-16 12:52:08 +00:00
|
|
|
float centre[3], extents[3];
|
2004-05-21 09:21:15 +00:00
|
|
|
float radius = my_boundbox_mesh((Mesh*) ob->data, centre, extents);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
if (!meshobj) {
|
|
|
|
meshobj = BL_ConvertMesh(mesh,ob,rendertools,kxscene,converter);
|
|
|
|
converter->RegisterGameMesh(meshobj, mesh);
|
|
|
|
}
|
|
|
|
|
|
|
|
// needed for python scripting
|
|
|
|
kxscene->GetLogicManager()->RegisterMeshName(meshobj->GetName(),meshobj);
|
|
|
|
|
|
|
|
gameobj = new BL_DeformableGameObject(kxscene,KX_Scene::m_callbacks);
|
|
|
|
|
|
|
|
// set transformation
|
|
|
|
gameobj->AddMesh(meshobj);
|
|
|
|
|
|
|
|
// for all objects: check whether they want to
|
|
|
|
// respond to updates
|
|
|
|
bool ignoreActivityCulling =
|
|
|
|
((ob->gameflag2 & OB_NEVER_DO_ACTIVITY_CULLING)!=0);
|
|
|
|
gameobj->SetIgnoreActivityCulling(ignoreActivityCulling);
|
|
|
|
|
|
|
|
// If this is a skin object, make Skin Controller
|
|
|
|
if (ob->parent && ob->parent->type == OB_ARMATURE && ob->partype==PARSKEL && ((Mesh*)ob->data)->dvert){
|
2006-01-06 03:46:54 +00:00
|
|
|
BL_SkinDeformer *dcont = new BL_SkinDeformer(ob, (BL_SkinMeshObject*)meshobj );
|
2002-10-12 11:37:38 +00:00
|
|
|
((BL_DeformableGameObject*)gameobj)->m_pDeformer = dcont;
|
|
|
|
}
|
|
|
|
else if (((Mesh*)ob->data)->dvert){
|
2006-01-06 03:46:54 +00:00
|
|
|
BL_MeshDeformer *dcont = new BL_MeshDeformer(ob, (BL_SkinMeshObject*)meshobj );
|
2002-10-12 11:37:38 +00:00
|
|
|
((BL_DeformableGameObject*)gameobj)->m_pDeformer = dcont;
|
|
|
|
}
|
2004-05-16 12:52:08 +00:00
|
|
|
|
|
|
|
MT_Point3 min = MT_Point3(centre) - MT_Vector3(extents);
|
|
|
|
MT_Point3 max = MT_Point3(centre) + MT_Vector3(extents);
|
|
|
|
SG_BBox bbox = SG_BBox(min, max);
|
|
|
|
gameobj->GetSGNode()->SetBBox(bbox);
|
2004-05-21 09:21:15 +00:00
|
|
|
gameobj->GetSGNode()->SetRadius(radius);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case OB_ARMATURE:
|
|
|
|
{
|
2006-01-06 03:46:54 +00:00
|
|
|
gameobj = new BL_ArmatureObject(
|
|
|
|
kxscene,
|
|
|
|
KX_Scene::m_callbacks,
|
|
|
|
ob // handle
|
|
|
|
);
|
2002-10-12 11:37:38 +00:00
|
|
|
/* Get the current pose from the armature object and apply it as the rest pose */
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
case OB_EMPTY:
|
|
|
|
{
|
|
|
|
gameobj = new KX_EmptyObject(kxscene,KX_Scene::m_callbacks);
|
|
|
|
// set transformation
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return gameobj;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct parentChildLink {
|
|
|
|
struct Object* m_blenderchild;
|
|
|
|
SG_Node* m_gamechildnode;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find the specified scene by name, or the first
|
|
|
|
* scene if nothing matches (shouldn't happen).
|
|
|
|
*/
|
|
|
|
static struct Scene *GetSceneForName(struct Main *maggie, const STR_String& scenename) {
|
|
|
|
Scene *sce;
|
|
|
|
|
|
|
|
for (sce= (Scene*) maggie->scene.first; sce; sce= (Scene*) sce->id.next)
|
|
|
|
if (scenename == (sce->id.name+2))
|
|
|
|
return sce;
|
|
|
|
|
|
|
|
return (Scene*) maggie->scene.first;
|
|
|
|
}
|
|
|
|
|
2006-11-30 00:19:27 +00:00
|
|
|
#include "DNA_constraint_types.h"
|
|
|
|
#include "BIF_editconstraint.h"
|
|
|
|
|
|
|
|
bPoseChannel *get_active_posechannel2 (Object *ob)
|
|
|
|
{
|
|
|
|
bArmature *arm= (bArmature*)ob->data;
|
|
|
|
bPoseChannel *pchan;
|
|
|
|
|
|
|
|
/* find active */
|
|
|
|
for(pchan= (bPoseChannel *)ob->pose->chanbase.first; pchan; pchan= pchan->next) {
|
|
|
|
if(pchan->bone && (pchan->bone->flag & BONE_ACTIVE) && (pchan->bone->layer & arm->layer))
|
|
|
|
return pchan;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
ListBase *get_active_constraints2(Object *ob)
|
|
|
|
{
|
|
|
|
if (!ob)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
if (ob->flag & OB_POSEMODE) {
|
|
|
|
bPoseChannel *pchan;
|
|
|
|
|
|
|
|
pchan = get_active_posechannel2(ob);
|
|
|
|
if (pchan)
|
|
|
|
return &pchan->constraints;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return &ob->constraints;
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void RBJconstraints(Object *ob)//not used
|
|
|
|
{
|
|
|
|
ListBase *conlist;
|
|
|
|
bConstraint *curcon;
|
|
|
|
|
|
|
|
conlist = get_active_constraints2(ob);
|
|
|
|
|
|
|
|
if (conlist) {
|
|
|
|
for (curcon = (bConstraint *)conlist->first; curcon; curcon=(bConstraint *)curcon->next) {
|
|
|
|
|
|
|
|
printf("%i\n",curcon->type);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#include "PHY_IPhysicsEnvironment.h"
|
|
|
|
#include "KX_IPhysicsController.h"
|
|
|
|
#include "PHY_DynamicTypes.h"
|
|
|
|
|
|
|
|
KX_IPhysicsController* getPhId(CListValue* sumolist,STR_String busc){//not used
|
|
|
|
|
|
|
|
for (int j=0;j<sumolist->GetCount();j++)
|
|
|
|
{
|
|
|
|
KX_GameObject* gameobje = (KX_GameObject*) sumolist->GetValue(j);
|
|
|
|
if (gameobje->GetName()==busc)
|
|
|
|
return gameobje->GetPhysicsController();
|
|
|
|
}
|
|
|
|
|
2006-12-12 13:24:45 +00:00
|
|
|
return 0;
|
|
|
|
|
2006-11-30 00:19:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
KX_GameObject* getGameOb(STR_String busc,CListValue* sumolist){
|
|
|
|
|
|
|
|
for (int j=0;j<sumolist->GetCount();j++)
|
|
|
|
{
|
|
|
|
KX_GameObject* gameobje = (KX_GameObject*) sumolist->GetValue(j);
|
|
|
|
if (gameobje->GetName()==busc)
|
|
|
|
return gameobje;
|
|
|
|
}
|
2006-12-12 13:24:45 +00:00
|
|
|
|
|
|
|
return 0;
|
2006-11-30 00:19:27 +00:00
|
|
|
|
|
|
|
}
|
2006-12-16 05:50:38 +00:00
|
|
|
#include "BLI_arithb.h"
|
2002-10-12 11:37:38 +00:00
|
|
|
// convert blender objects into ketsji gameobjects
|
|
|
|
void BL_ConvertBlenderObjects(struct Main* maggie,
|
|
|
|
const STR_String& scenename,
|
|
|
|
KX_Scene* kxscene,
|
|
|
|
KX_KetsjiEngine* ketsjiEngine,
|
|
|
|
e_PhysicsEngine physics_engine,
|
|
|
|
PyObject* pythondictionary,
|
|
|
|
SCA_IInputDevice* keydev,
|
|
|
|
RAS_IRenderTools* rendertools,
|
|
|
|
RAS_ICanvas* canvas,
|
|
|
|
KX_BlenderSceneConverter* converter,
|
|
|
|
bool alwaysUseExpandFraming
|
|
|
|
)
|
|
|
|
{
|
2005-08-23 13:16:02 +00:00
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
Scene *blenderscene = GetSceneForName(maggie, scenename);
|
|
|
|
|
|
|
|
// Get the frame settings of the canvas.
|
|
|
|
// Get the aspect ratio of the canvas as designed by the user.
|
|
|
|
|
|
|
|
RAS_FrameSettings::RAS_FrameType frame_type;
|
|
|
|
int aspect_width;
|
|
|
|
int aspect_height;
|
2006-12-16 05:50:38 +00:00
|
|
|
vector<MT_Vector3> inivel,iniang;
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
if (alwaysUseExpandFraming) {
|
|
|
|
frame_type = RAS_FrameSettings::e_frame_extend;
|
|
|
|
aspect_width = canvas->GetWidth();
|
|
|
|
aspect_height = canvas->GetHeight();
|
|
|
|
} else {
|
|
|
|
if (blenderscene->framing.type == SCE_GAMEFRAMING_BARS) {
|
|
|
|
frame_type = RAS_FrameSettings::e_frame_bars;
|
|
|
|
} else if (blenderscene->framing.type == SCE_GAMEFRAMING_EXTEND) {
|
|
|
|
frame_type = RAS_FrameSettings::e_frame_extend;
|
|
|
|
} else {
|
|
|
|
frame_type = RAS_FrameSettings::e_frame_scale;
|
|
|
|
}
|
|
|
|
|
|
|
|
aspect_width = blenderscene->r.xsch;
|
|
|
|
aspect_height = blenderscene->r.ysch;
|
|
|
|
}
|
|
|
|
|
|
|
|
RAS_FrameSettings frame_settings(
|
|
|
|
frame_type,
|
|
|
|
blenderscene->framing.col[0],
|
|
|
|
blenderscene->framing.col[1],
|
|
|
|
blenderscene->framing.col[2],
|
|
|
|
aspect_width,
|
|
|
|
aspect_height
|
|
|
|
);
|
|
|
|
kxscene->SetFramingType(frame_settings);
|
|
|
|
|
|
|
|
kxscene->SetGravity(MT_Vector3(0,0,(blenderscene->world != NULL) ? -blenderscene->world->gravity : -9.8));
|
|
|
|
|
|
|
|
/* set activity culling parameters */
|
|
|
|
if (blenderscene->world) {
|
|
|
|
kxscene->SetActivityCulling( (blenderscene->world->mode & WO_ACTIVITY_CULLING) != 0);
|
|
|
|
kxscene->SetActivityCullingRadius(blenderscene->world->activityBoxRadius);
|
|
|
|
} else {
|
|
|
|
kxscene->SetActivityCulling(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
int activeLayerBitInfo = blenderscene->lay;
|
|
|
|
|
|
|
|
// templist to find Root Parents (object with no parents)
|
|
|
|
CListValue* templist = new CListValue();
|
|
|
|
CListValue* sumolist = new CListValue();
|
|
|
|
|
|
|
|
vector<parentChildLink> vec_parent_child;
|
|
|
|
|
|
|
|
CListValue* objectlist = kxscene->GetObjectList();
|
|
|
|
CListValue* parentlist = kxscene->GetRootParentList();
|
|
|
|
|
|
|
|
SCA_LogicManager* logicmgr = kxscene->GetLogicManager();
|
|
|
|
SCA_TimeEventManager* timemgr = kxscene->GetTimeEventManager();
|
|
|
|
|
|
|
|
CListValue* logicbrick_conversionlist = new CListValue();
|
|
|
|
|
2004-05-16 12:52:08 +00:00
|
|
|
SG_TreeFactory tf;
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
// Convert actions to actionmap
|
|
|
|
bAction *curAct;
|
|
|
|
for (curAct = (bAction*)maggie->action.first; curAct; curAct=(bAction*)curAct->id.next)
|
|
|
|
{
|
|
|
|
logicmgr->RegisterActionName(curAct->id.name, curAct);
|
|
|
|
}
|
2006-01-06 03:46:54 +00:00
|
|
|
|
2004-12-01 08:43:02 +00:00
|
|
|
SetDefaultFaceType(blenderscene);
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
Base *base = static_cast<Base*>(blenderscene->base.first);
|
|
|
|
while(base)
|
|
|
|
{
|
|
|
|
Object* blenderobject = base->object;
|
|
|
|
KX_GameObject* gameobj = gameobject_from_blenderobject(
|
|
|
|
base->object,
|
|
|
|
kxscene,
|
|
|
|
rendertools,
|
|
|
|
converter,
|
|
|
|
blenderscene);
|
|
|
|
|
|
|
|
if (gameobj)
|
|
|
|
{
|
2006-12-16 05:50:38 +00:00
|
|
|
MT_Point3 posPrev;
|
|
|
|
MT_Matrix3x3 angor;
|
|
|
|
if (converter->addInitFromFrame) blenderscene->r.cfra=blenderscene->r.sfra;
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
MT_Point3 pos = MT_Point3(
|
|
|
|
blenderobject->loc[0]+blenderobject->dloc[0],
|
|
|
|
blenderobject->loc[1]+blenderobject->dloc[1],
|
|
|
|
blenderobject->loc[2]+blenderobject->dloc[2]
|
|
|
|
);
|
|
|
|
MT_Vector3 eulxyz = MT_Vector3(
|
|
|
|
blenderobject->rot[0],
|
|
|
|
blenderobject->rot[1],
|
|
|
|
blenderobject->rot[2]
|
|
|
|
);
|
|
|
|
MT_Vector3 scale = MT_Vector3(
|
|
|
|
blenderobject->size[0],
|
|
|
|
blenderobject->size[1],
|
|
|
|
blenderobject->size[2]
|
|
|
|
);
|
2006-12-16 05:50:38 +00:00
|
|
|
if (converter->addInitFromFrame){//rcruiz
|
|
|
|
float eulxyzPrev[3];
|
|
|
|
blenderscene->r.cfra=blenderscene->r.sfra-1;
|
|
|
|
update_for_newframe();
|
|
|
|
MT_Vector3 tmp=pos-MT_Point3(blenderobject->loc[0]+blenderobject->dloc[0],
|
|
|
|
blenderobject->loc[1]+blenderobject->dloc[1],
|
|
|
|
blenderobject->loc[2]+blenderobject->dloc[2]
|
|
|
|
);
|
|
|
|
eulxyzPrev[0]=blenderobject->rot[0];
|
|
|
|
eulxyzPrev[1]=blenderobject->rot[1];
|
|
|
|
eulxyzPrev[2]=blenderobject->rot[2];
|
|
|
|
tmp.scale((float)blenderscene->r.frs_sec,(float)blenderscene->r.frs_sec,(float)blenderscene->r.frs_sec);
|
|
|
|
inivel.push_back(tmp);
|
|
|
|
tmp=eulxyz-eulxyzPrev;
|
|
|
|
tmp.scale((float)blenderscene->r.frs_sec,(float)blenderscene->r.frs_sec,(float)blenderscene->r.frs_sec);
|
|
|
|
iniang.push_back(tmp);
|
|
|
|
blenderscene->r.cfra=blenderscene->r.sfra;
|
|
|
|
update_for_newframe();
|
|
|
|
}
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
gameobj->NodeSetLocalPosition(pos);
|
|
|
|
gameobj->NodeSetLocalOrientation(MT_Matrix3x3(eulxyz));
|
|
|
|
gameobj->NodeSetLocalScale(scale);
|
|
|
|
gameobj->NodeUpdateGS(0,true);
|
|
|
|
|
|
|
|
BL_ConvertIpos(blenderobject,gameobj,converter);
|
2006-01-06 03:46:54 +00:00
|
|
|
// TODO: expand to multiple ipos per mesh
|
|
|
|
Material *mat = give_current_material(blenderobject, 1);
|
|
|
|
if(mat) BL_ConvertMaterialIpos(mat, gameobj, converter);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
bool isInActiveLayer = (blenderobject->lay & activeLayerBitInfo) !=0;
|
|
|
|
|
|
|
|
sumolist->Add(gameobj->AddRef());
|
|
|
|
|
|
|
|
BL_ConvertProperties(blenderobject,gameobj,timemgr,kxscene,isInActiveLayer);
|
|
|
|
|
|
|
|
|
|
|
|
gameobj->SetName(blenderobject->id.name);
|
|
|
|
|
|
|
|
// templist to find Root Parents (object with no parents)
|
|
|
|
templist->Add(gameobj->AddRef());
|
|
|
|
|
|
|
|
// update children/parent hierarchy
|
2006-12-16 05:50:38 +00:00
|
|
|
if ((blenderobject->parent != 0)&&(!converter->addInitFromFrame))
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
|
|
|
// blender has an additional 'parentinverse' offset in each object
|
|
|
|
SG_Node* parentinversenode = new SG_Node(NULL,NULL,SG_Callbacks());
|
|
|
|
|
|
|
|
// define a normal parent relationship for this node.
|
|
|
|
KX_NormalParentRelation * parent_relation = KX_NormalParentRelation::New();
|
|
|
|
parentinversenode->SetParentRelation(parent_relation);
|
|
|
|
|
|
|
|
parentChildLink pclink;
|
|
|
|
pclink.m_blenderchild = blenderobject;
|
|
|
|
pclink.m_gamechildnode = parentinversenode;
|
|
|
|
vec_parent_child.push_back(pclink);
|
2005-04-23 11:36:44 +00:00
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
float* fl = (float*) blenderobject->parentinv;
|
|
|
|
MT_Transform parinvtrans(fl);
|
|
|
|
parentinversenode->SetLocalPosition(parinvtrans.getOrigin());
|
|
|
|
parentinversenode->SetLocalOrientation(parinvtrans.getBasis());
|
2005-04-23 11:36:44 +00:00
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
parentinversenode->AddChild(gameobj->GetSGNode());
|
|
|
|
}
|
|
|
|
|
|
|
|
// needed for python scripting
|
|
|
|
logicmgr->RegisterGameObjectName(gameobj->GetName(),gameobj);
|
Patch: [ #2439 ] Makes objects react properly to deformations after a mesh replacement call.
from brian hayward (bthayward)
Detailed description:
Currently, when an armature deformed object's mesh is replaced by the ReplaceMesh actuator, the new mesh fails to deform to the armature's movement.
My patch fixes this by properly replacing the deform controller along with the mesh (when appropriete).
For instance, if one had an animated character using any of the standard deformation techniques (armature, ipo, RVK, or AVK), that character's mesh would currently be prevented from changing mid-game. It could be replaced, but the new mesh would lack the controller which tells it how to deform. If one wanted to dynamiclly add a hat on top of the character's head, it would require storing a secondary prebuilt character (mesh, armature, logic, ect...) on another layer FOR EACH HAT the character could possibly wear, then swapping out the whole character when the hat change was desired. So if you had 4 possible hat/character combos, you would have 4 character meshes, 4 armatures, 4 sets of logic, and so on. I find this lack of flexibility to be unresonable.
With my patch, one could accomplish the same thing mearly by making one version of the character in the main layer, and adding an invisible object atop the character's head (which is parented to the head bone). Then whenever it becomes desirable, one can replace the invisible object's mesh with the desirable hat's mesh, then make it visible. With my patch, the hat object would then continue to deform to the character's head regardless of which hat was currently being worn.
*note 1*
for armature/mesh deformations, the new mesh must have properly assigned vertex groups which match one or more of the bones of the target armature before the replaceMesh call is made. Otherwise the vertices won't react to the armature because they won't know how. (not sure if vertices can be scripted to change groups after the game has started)
*note 2*
The added processing time involved with replacing the object's deform controller is negligible.
2005-04-18 11:44:21 +00:00
|
|
|
|
|
|
|
// needed for dynamic object morphing
|
|
|
|
logicmgr->RegisterGameObj(gameobj, blenderobject);
|
|
|
|
for (int i = 0; i < gameobj->GetMeshCount(); i++)
|
|
|
|
logicmgr->RegisterGameMeshName(gameobj->GetMesh(i)->GetName(), blenderobject);
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
converter->RegisterGameObject(gameobj, blenderobject);
|
|
|
|
// this was put in rapidly, needs to be looked at more closely
|
|
|
|
// only draw/use objects in active 'blender' layers
|
|
|
|
|
|
|
|
logicbrick_conversionlist->Add(gameobj->AddRef());
|
|
|
|
|
2006-12-16 05:50:38 +00:00
|
|
|
if (converter->addInitFromFrame){
|
|
|
|
posPrev=gameobj->NodeGetWorldPosition();
|
|
|
|
angor=gameobj->NodeGetWorldOrientation();
|
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
if (isInActiveLayer)
|
|
|
|
{
|
|
|
|
objectlist->Add(gameobj->AddRef());
|
2004-05-16 12:52:08 +00:00
|
|
|
tf.Add(gameobj->GetSGNode());
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
gameobj->NodeUpdateGS(0,true);
|
|
|
|
gameobj->Bucketize();
|
|
|
|
|
2004-05-16 12:52:08 +00:00
|
|
|
}
|
2006-12-16 05:50:38 +00:00
|
|
|
if (converter->addInitFromFrame){
|
|
|
|
gameobj->NodeSetLocalPosition(posPrev);
|
|
|
|
gameobj->NodeSetLocalOrientation(angor);
|
|
|
|
}
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
base = base->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (blenderscene->camera) {
|
|
|
|
KX_Camera *gamecamera= (KX_Camera*) converter->FindGameObject(blenderscene->camera);
|
|
|
|
|
|
|
|
kxscene->SetActiveCamera(gamecamera);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set up armatures
|
|
|
|
for (base = static_cast<Base*>(blenderscene->base.first); base; base=base->next){
|
|
|
|
if (base->object->type==OB_MESH){
|
|
|
|
Mesh *me = (Mesh*)base->object->data;
|
|
|
|
|
|
|
|
if (me->dvert){
|
|
|
|
KX_GameObject *obj = converter->FindGameObject(base->object);
|
|
|
|
|
|
|
|
if (base->object->parent && base->object->parent->type==OB_ARMATURE && base->object->partype==PARSKEL){
|
|
|
|
KX_GameObject *par = converter->FindGameObject(base->object->parent);
|
|
|
|
if (par)
|
|
|
|
((BL_SkinDeformer*)(((BL_DeformableGameObject*)obj)->m_pDeformer))->SetArmature((BL_ArmatureObject*) par);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// create hierarchy information
|
|
|
|
int i;
|
|
|
|
vector<parentChildLink>::iterator pcit;
|
|
|
|
|
|
|
|
for (pcit = vec_parent_child.begin();!(pcit==vec_parent_child.end());++pcit)
|
|
|
|
{
|
|
|
|
|
|
|
|
struct Object* blenderchild = pcit->m_blenderchild;
|
2005-04-23 11:36:44 +00:00
|
|
|
switch (blenderchild->partype)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
2005-04-23 11:36:44 +00:00
|
|
|
case PARVERT1:
|
|
|
|
{
|
|
|
|
// creat a new vertex parent relationship for this node.
|
|
|
|
KX_VertexParentRelation * vertex_parent_relation = KX_VertexParentRelation::New();
|
|
|
|
pcit->m_gamechildnode->SetParentRelation(vertex_parent_relation);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PARSLOW:
|
|
|
|
{
|
|
|
|
// creat a new slow parent relationship for this node.
|
|
|
|
KX_SlowParentRelation * slow_parent_relation = KX_SlowParentRelation::New(blenderchild->sf);
|
|
|
|
pcit->m_gamechildnode->SetParentRelation(slow_parent_relation);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PARBONE:
|
|
|
|
{
|
|
|
|
// parent this to a bone
|
|
|
|
Bone *parent_bone = get_named_bone(get_armature(blenderchild->parent), blenderchild->parsubstr);
|
|
|
|
KX_BoneParentRelation *bone_parent_relation = KX_BoneParentRelation::New(parent_bone);
|
|
|
|
pcit->m_gamechildnode->SetParentRelation(bone_parent_relation);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case PARSKEL: // skinned - ignore
|
|
|
|
break;
|
|
|
|
case PAROBJECT:
|
|
|
|
case PARCURVE:
|
|
|
|
case PARKEY:
|
|
|
|
case PARVERT3:
|
|
|
|
default:
|
|
|
|
// unhandled
|
|
|
|
break;
|
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
|
|
|
|
struct Object* blenderparent = blenderchild->parent;
|
|
|
|
KX_GameObject* parentobj = converter->FindGameObject(blenderparent);
|
|
|
|
if (parentobj)
|
|
|
|
{
|
|
|
|
parentobj-> GetSGNode()->AddChild(pcit->m_gamechildnode);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
vec_parent_child.clear();
|
|
|
|
|
|
|
|
// find 'root' parents (object that has not parents in SceneGraph)
|
|
|
|
for (i=0;i<templist->GetCount();++i)
|
|
|
|
{
|
|
|
|
KX_GameObject* gameobj = (KX_GameObject*) templist->GetValue(i);
|
|
|
|
if (gameobj->GetSGNode()->GetSGParent() == 0)
|
|
|
|
{
|
|
|
|
parentlist->Add(gameobj->AddRef());
|
|
|
|
gameobj->NodeUpdateGS(0,true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-12-01 01:04:27 +00:00
|
|
|
bool processCompoundChildren = false;
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
// create physics information
|
|
|
|
for (i=0;i<sumolist->GetCount();i++)
|
|
|
|
{
|
|
|
|
KX_GameObject* gameobj = (KX_GameObject*) sumolist->GetValue(i);
|
|
|
|
struct Object* blenderobject = converter->FindBlenderObject(gameobj);
|
|
|
|
int nummeshes = gameobj->GetMeshCount();
|
|
|
|
RAS_MeshObject* meshobj = 0;
|
|
|
|
if (nummeshes > 0)
|
|
|
|
{
|
|
|
|
meshobj = gameobj->GetMesh(0);
|
|
|
|
}
|
2006-12-01 01:04:27 +00:00
|
|
|
BL_CreatePhysicsObjectNew(gameobj,blenderobject,meshobj,kxscene,activeLayerBitInfo,physics_engine,converter,processCompoundChildren);
|
|
|
|
}
|
2002-10-12 11:37:38 +00:00
|
|
|
|
2006-12-01 01:04:27 +00:00
|
|
|
processCompoundChildren = true;
|
|
|
|
// create physics information
|
|
|
|
for (i=0;i<sumolist->GetCount();i++)
|
|
|
|
{
|
|
|
|
KX_GameObject* gameobj = (KX_GameObject*) sumolist->GetValue(i);
|
|
|
|
struct Object* blenderobject = converter->FindBlenderObject(gameobj);
|
|
|
|
int nummeshes = gameobj->GetMeshCount();
|
|
|
|
RAS_MeshObject* meshobj = 0;
|
|
|
|
if (nummeshes > 0)
|
|
|
|
{
|
|
|
|
meshobj = gameobj->GetMesh(0);
|
|
|
|
}
|
|
|
|
BL_CreatePhysicsObjectNew(gameobj,blenderobject,meshobj,kxscene,activeLayerBitInfo,physics_engine,converter,processCompoundChildren);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
2006-12-16 05:50:38 +00:00
|
|
|
|
|
|
|
|
|
|
|
//set ini linearVel and int angularVel //rcruiz
|
|
|
|
if (converter->addInitFromFrame)
|
|
|
|
for (i=0;i<sumolist->GetCount();i++)
|
|
|
|
{
|
|
|
|
KX_GameObject* gameobj = (KX_GameObject*) sumolist->GetValue(i);
|
|
|
|
if (gameobj->IsDynamic()){
|
|
|
|
gameobj->setLinearVelocity(inivel[i],false);
|
|
|
|
gameobj->setAngularVelocity(iniang[i],false);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2006-12-01 01:04:27 +00:00
|
|
|
|
2006-11-30 00:19:27 +00:00
|
|
|
// create physics joints
|
|
|
|
for (i=0;i<sumolist->GetCount();i++)
|
|
|
|
{
|
|
|
|
KX_GameObject* gameobj = (KX_GameObject*) sumolist->GetValue(i);
|
|
|
|
struct Object* blenderobject = converter->FindBlenderObject(gameobj);
|
|
|
|
int nummeshes = gameobj->GetMeshCount();
|
|
|
|
RAS_MeshObject* meshobj = 0;
|
|
|
|
ListBase *conlist;
|
|
|
|
bConstraint *curcon;
|
|
|
|
conlist = get_active_constraints2(blenderobject);
|
|
|
|
if (conlist) {
|
|
|
|
for (curcon = (bConstraint *)conlist->first; curcon; curcon=(bConstraint *)curcon->next) {
|
|
|
|
if (curcon->type==CONSTRAINT_TYPE_RIGIDBODYJOINT){
|
|
|
|
bRigidBodyJointConstraint *dat=(bRigidBodyJointConstraint *)curcon->data;
|
2006-12-02 03:48:36 +00:00
|
|
|
//if (dat->tar)
|
2006-11-30 00:19:27 +00:00
|
|
|
if (!dat->child){
|
2006-12-02 03:48:36 +00:00
|
|
|
PHY_IPhysicsController* physctr2 = 0;
|
|
|
|
if (dat->tar)
|
|
|
|
{
|
|
|
|
KX_GameObject *gotar=getGameOb(dat->tar->id.name,sumolist);
|
2006-12-17 05:54:45 +00:00
|
|
|
if (gotar && gotar->GetPhysicsController())
|
2006-12-12 13:24:45 +00:00
|
|
|
physctr2 = (PHY_IPhysicsController*) gotar->GetPhysicsController()->GetUserData();
|
2006-12-02 03:48:36 +00:00
|
|
|
}
|
2006-12-02 22:25:47 +00:00
|
|
|
|
|
|
|
if (gameobj->GetPhysicsController())
|
2006-12-02 03:48:36 +00:00
|
|
|
{
|
2006-12-18 07:51:12 +00:00
|
|
|
float radsPerDeg = 6.283185307179586232f / 360.f;
|
|
|
|
|
2006-12-02 22:25:47 +00:00
|
|
|
PHY_IPhysicsController* physctrl = (PHY_IPhysicsController*) gameobj->GetPhysicsController()->GetUserData();
|
2006-12-16 05:50:38 +00:00
|
|
|
//we need to pass a full constraint frame, not just axis
|
2006-12-02 22:25:47 +00:00
|
|
|
|
2006-12-16 05:50:38 +00:00
|
|
|
//localConstraintFrameBasis
|
2006-12-18 07:51:12 +00:00
|
|
|
MT_Matrix3x3 localCFrame(MT_Vector3(radsPerDeg*dat->axX,radsPerDeg*dat->axY,radsPerDeg*dat->axZ));
|
2006-12-16 05:50:38 +00:00
|
|
|
MT_Vector3 axis0 = localCFrame.getColumn(0);
|
|
|
|
MT_Vector3 axis1 = localCFrame.getColumn(1);
|
|
|
|
MT_Vector3 axis2 = localCFrame.getColumn(2);
|
|
|
|
|
|
|
|
int constraintId = kxscene->GetPhysicsEnvironment()->createConstraint(physctrl,physctr2,(PHY_ConstraintType)dat->type,(float)dat->pivX,(float)dat->pivY,(float)dat->pivZ,
|
|
|
|
(float)axis0.x(),(float)axis0.y(),(float)axis0.z(),
|
|
|
|
(float)axis1.x(),(float)axis1.y(),(float)axis1.z(),
|
|
|
|
(float)axis2.x(),(float)axis2.y(),(float)axis2.z()
|
|
|
|
);
|
2006-12-02 22:25:47 +00:00
|
|
|
//if it is a generic 6DOF constraint, set all the limits accordingly
|
|
|
|
if (dat->type == PHY_GENERIC_6DOF_CONSTRAINT)
|
2006-12-02 03:48:36 +00:00
|
|
|
{
|
2006-12-02 22:25:47 +00:00
|
|
|
int dof;
|
|
|
|
int dofbit=1;
|
|
|
|
for (dof=0;dof<6;dof++)
|
2006-12-02 03:48:36 +00:00
|
|
|
{
|
2006-12-02 22:25:47 +00:00
|
|
|
if (dat->flag & dofbit)
|
|
|
|
{
|
|
|
|
kxscene->GetPhysicsEnvironment()->setConstraintParam(constraintId,dof,dat->minLimit[dof],dat->maxLimit[dof]);
|
|
|
|
} else
|
|
|
|
{
|
|
|
|
//minLimit > maxLimit means free(disabled limit) for this degree of freedom
|
|
|
|
kxscene->GetPhysicsEnvironment()->setConstraintParam(constraintId,dof,1,-1);
|
|
|
|
}
|
|
|
|
dofbit<<=1;
|
2006-12-02 03:48:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2006-11-30 00:19:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
templist->Release();
|
|
|
|
sumolist->Release();
|
|
|
|
|
|
|
|
int executePriority=0; /* incremented by converter routines */
|
|
|
|
|
|
|
|
// convert global sound stuff
|
|
|
|
|
|
|
|
/* XXX, glob is the very very wrong place for this
|
|
|
|
* to be, re-enable once the listener has been moved into
|
|
|
|
* the scene. */
|
2004-12-29 01:31:17 +00:00
|
|
|
#if 1
|
2002-10-12 11:37:38 +00:00
|
|
|
SND_Scene* soundscene = kxscene->GetSoundScene();
|
|
|
|
SND_SoundListener* listener = soundscene->GetListener();
|
2004-12-29 01:31:17 +00:00
|
|
|
if (listener && G.listener)
|
2002-10-12 11:37:38 +00:00
|
|
|
{
|
2004-12-29 01:31:17 +00:00
|
|
|
listener->SetDopplerFactor(G.listener->dopplerfactor);
|
|
|
|
listener->SetDopplerVelocity(G.listener->dopplervelocity);
|
|
|
|
listener->SetGain(G.listener->gain);
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// convert world
|
|
|
|
KX_WorldInfo* worldinfo = new BlenderWorldInfo(blenderscene->world);
|
|
|
|
converter->RegisterWorldInfo(worldinfo);
|
|
|
|
kxscene->SetWorldInfo(worldinfo);
|
2005-07-16 21:47:54 +00:00
|
|
|
|
|
|
|
#define CONVERT_LOGIC
|
|
|
|
#ifdef CONVERT_LOGIC
|
2002-10-12 11:37:38 +00:00
|
|
|
// convert logic bricks, sensors, controllers and actuators
|
|
|
|
for (i=0;i<logicbrick_conversionlist->GetCount();i++)
|
|
|
|
{
|
|
|
|
KX_GameObject* gameobj = static_cast<KX_GameObject*>(logicbrick_conversionlist->GetValue(i));
|
|
|
|
struct Object* blenderobj = converter->FindBlenderObject(gameobj);
|
|
|
|
bool isInActiveLayer = (blenderobj->lay & activeLayerBitInfo)!=0;
|
|
|
|
BL_ConvertActuators(maggie->name, blenderobj,gameobj,logicmgr,kxscene,ketsjiEngine,executePriority, activeLayerBitInfo,isInActiveLayer,rendertools,converter);
|
|
|
|
}
|
|
|
|
for ( i=0;i<logicbrick_conversionlist->GetCount();i++)
|
|
|
|
{
|
|
|
|
KX_GameObject* gameobj = static_cast<KX_GameObject*>(logicbrick_conversionlist->GetValue(i));
|
|
|
|
struct Object* blenderobj = converter->FindBlenderObject(gameobj);
|
|
|
|
bool isInActiveLayer = (blenderobj->lay & activeLayerBitInfo)!=0;
|
|
|
|
BL_ConvertControllers(blenderobj,gameobj,logicmgr,pythondictionary,executePriority,activeLayerBitInfo,isInActiveLayer,converter);
|
|
|
|
}
|
|
|
|
for ( i=0;i<logicbrick_conversionlist->GetCount();i++)
|
|
|
|
{
|
|
|
|
KX_GameObject* gameobj = static_cast<KX_GameObject*>(logicbrick_conversionlist->GetValue(i));
|
|
|
|
struct Object* blenderobj = converter->FindBlenderObject(gameobj);
|
|
|
|
bool isInActiveLayer = (blenderobj->lay & activeLayerBitInfo)!=0;
|
|
|
|
BL_ConvertSensors(blenderobj,gameobj,logicmgr,kxscene,keydev,executePriority,activeLayerBitInfo,isInActiveLayer,canvas,converter);
|
|
|
|
}
|
2005-07-16 21:47:54 +00:00
|
|
|
#endif //CONVERT_LOGIC
|
|
|
|
|
2002-10-12 11:37:38 +00:00
|
|
|
logicbrick_conversionlist->Release();
|
2004-05-16 12:52:08 +00:00
|
|
|
|
|
|
|
// Calculate the scene btree -
|
|
|
|
// too slow - commented out.
|
|
|
|
//kxscene->SetNodeTree(tf.MakeTree());
|
2002-10-12 11:37:38 +00:00
|
|
|
}
|
2004-05-16 12:52:08 +00:00
|
|
|
|