- added API functions:

- Mesh.calc_normals
 - Object.add_vertex_to_group
 - Main.add_material
 - Main.add_texture
 - Material.add_texture
- OBJ importer conversion in progress
This commit is contained in:
Arystanbek Dyussenov 2009-07-02 20:46:35 +00:00
parent 6ede28a05a
commit 617851bf21
9 changed files with 297 additions and 91 deletions

@ -464,7 +464,7 @@ def write(filename, objects, scene,
# XXX
# High Quality Normals
if EXPORT_NORMALS and face_index_pairs:
pass
me.calc_normals()
# if EXPORT_NORMALS_HQ:
# BPyMesh.meshCalcNormals(me)
# else:

@ -42,7 +42,7 @@ Note, This loads mesh objects and materials only, nurbs and curves are not suppo
from Blender import Mesh, Draw, Window, Texture, Material, sys
import bpy
import BPyMesh
# import BPyMesh
import BPyImage
import BPyMessages
@ -130,9 +130,11 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_
# This function sets textures defined in .mtl file #
#==================================================================================#
def load_material_image(blender_material, context_material_name, imagepath, type):
texture= bpy.data.textures.new(type)
texture.setType('Image')
texture= bpy.data.add_texture(type)
texture.type= 'IMAGE'
# texture= bpy.data.textures.new(type)
# texture.setType('Image')
# Absolute path - c:\.. etc would work here
image= obj_image_load(imagepath, DIR, IMAGE_SEARCH)
@ -182,7 +184,8 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_
#Create new materials
for name in unique_materials: # .keys()
if name != None:
unique_materials[name]= bpy.data.materials.new(name)
unique_materials[name]= bpy.data.add_material(name)
# unique_materials[name]= bpy.data.materials.new(name)
unique_material_images[name]= None, False # assign None to all material images to start with, add to later.
unique_materials[None]= None
@ -190,7 +193,8 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_
for libname in material_libs:
mtlpath= DIR + libname
if not sys.exists(mtlpath):
if not bpy.sys.exists(mtlpath):
# if not sys.exists(mtlpath):
#print '\tError Missing MTL: "%s"' % mtlpath
pass
else:
@ -210,17 +214,23 @@ def create_materials(filepath, material_libs, unique_materials, unique_material_
line_split= line.split()
line_lower= line.lower().lstrip()
if line_lower.startswith('ka'):
context_material.setMirCol((float(line_split[1]), float(line_split[2]), float(line_split[3])))
context_material.mirror_color = (float(line_split[1]), float(line_split[2]), float(line_split[3]))
# context_material.setMirCol((float(line_split[1]), float(line_split[2]), float(line_split[3])))
elif line_lower.startswith('kd'):
context_material.setRGBCol((float(line_split[1]), float(line_split[2]), float(line_split[3])))
context_material.diffuse_color = (float(line_split[1]), float(line_split[2]), float(line_split[3]))
# context_material.setRGBCol((float(line_split[1]), float(line_split[2]), float(line_split[3])))
elif line_lower.startswith('ks'):
context_material.setSpecCol((float(line_split[1]), float(line_split[2]), float(line_split[3])))
context_material.specular_color = (float(line_split[1]), float(line_split[2]), float(line_split[3]))
# context_material.setSpecCol((float(line_split[1]), float(line_split[2]), float(line_split[3])))
elif line_lower.startswith('ns'):
context_material.setHardness( int((float(line_split[1])*0.51)) )
context_material.specular_hardness = int((float(line_split[1])*0.51))
# context_material.setHardness( int((float(line_split[1])*0.51)) )
elif line_lower.startswith('ni'): # Refraction index
context_material.setIOR( max(1, min(float(line_split[1]), 3))) # Between 1 and 3
context_material.ior = max(1, min(float(line_split[1]), 3))
# context_material.setIOR( max(1, min(float(line_split[1]), 3))) # Between 1 and 3
elif line_lower.startswith('d') or line_lower.startswith('tr'):
context_material.setAlpha(float(line_split[1]))
context_material.alpha = float(line_split[1])
# context_material.setAlpha(float(line_split[1]))
elif line_lower.startswith('map_ka'):
img_filepath= line_value(line.split())
if img_filepath:
@ -395,39 +405,39 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
edge_dict[i1,i2]= 1
# FGons into triangles
if has_ngons and len_face_vert_loc_indicies > 4:
# if has_ngons and len_face_vert_loc_indicies > 4:
ngon_face_indices= BPyMesh.ngon(verts_loc, face_vert_loc_indicies)
faces.extend(\
[(\
[face_vert_loc_indicies[ngon[0]], face_vert_loc_indicies[ngon[1]], face_vert_loc_indicies[ngon[2]] ],\
[face_vert_tex_indicies[ngon[0]], face_vert_tex_indicies[ngon[1]], face_vert_tex_indicies[ngon[2]] ],\
context_material,\
context_smooth_group,\
context_object)\
for ngon in ngon_face_indices]\
)
# ngon_face_indices= BPyMesh.ngon(verts_loc, face_vert_loc_indicies)
# faces.extend(\
# [(\
# [face_vert_loc_indicies[ngon[0]], face_vert_loc_indicies[ngon[1]], face_vert_loc_indicies[ngon[2]] ],\
# [face_vert_tex_indicies[ngon[0]], face_vert_tex_indicies[ngon[1]], face_vert_tex_indicies[ngon[2]] ],\
# context_material,\
# context_smooth_group,\
# context_object)\
# for ngon in ngon_face_indices]\
# )
# edges to make fgons
if CREATE_FGONS:
edge_users= {}
for ngon in ngon_face_indices:
for i in (0,1,2):
i1= face_vert_loc_indicies[ngon[i ]]
i2= face_vert_loc_indicies[ngon[i-1]]
if i1>i2: i1,i2= i2,i1
# # edges to make fgons
# if CREATE_FGONS:
# edge_users= {}
# for ngon in ngon_face_indices:
# for i in (0,1,2):
# i1= face_vert_loc_indicies[ngon[i ]]
# i2= face_vert_loc_indicies[ngon[i-1]]
# if i1>i2: i1,i2= i2,i1
try:
edge_users[i1,i2]+=1
except KeyError:
edge_users[i1,i2]= 1
# try:
# edge_users[i1,i2]+=1
# except KeyError:
# edge_users[i1,i2]= 1
for key, users in edge_users.iteritems():
if users>1:
fgon_edges[key]= None
# for key, users in edge_users.iteritems():
# if users>1:
# fgon_edges[key]= None
# remove all after 3, means we dont have to pop this one.
faces.pop(f_idx)
# # remove all after 3, means we dont have to pop this one.
# faces.pop(f_idx)
# Build sharp edges
@ -564,33 +574,36 @@ def create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_l
# me_edges[ed].flag |= SHARP
# del SHARP
# if CREATE_EDGES:
if CREATE_EDGES:
me.add_geometry(0, len(edges))
# edges is (should be) a list of (a, b) tuples
me.edges.foreach_set("verts", unpack_list(edges))
# me_edges.extend( edges )
# del me_edges
me.calc_normals()
# me.calcNormals()
ob= bpy.data.add_object("MESH", "Mesh")
ob.data= me
scn.add_object(ob)
# ob= scn.objects.new(me)
new_objects.append(ob)
# # Create the vertex groups. No need to have the flag passed here since we test for the
# # content of the vertex_groups. If the user selects to NOT have vertex groups saved then
# # the following test will never run
# for group_name, group_indicies in vertex_groups.iteritems():
# i= ob.add_vertex_group(group_name)
# # me.addVertGroup(group_name)
# me.assign_verts_to_group(group_index, group_indicies, len(group_indicies), 1.0, 'REPLACE')
# # me.assignVertsToGroup(group_name, group_indicies, 1.00, Mesh.AssignModes.REPLACE)
# Create the vertex groups. No need to have the flag passed here since we test for the
# content of the vertex_groups. If the user selects to NOT have vertex groups saved then
# the following test will never run
for group_name, group_indicies in vertex_groups.iteritems():
group= ob.add_vertex_group(group_name)
# me.addVertGroup(group_name)
for vertex_index in group_indicies:
ob.add_vertex_to_group(vertex_index, group, 1.0, 'REPLACE')
# me.assignVertsToGroup(group_name, group_indicies, 1.00, Mesh.AssignModes.REPLACE)
class Mesh(bpy.types.Mesh):
def assign_verts_to_group(self, group_index, vert_indices, weight):
def create_nurbs(scn, context_nurbs, vert_loc, new_objects):
'''
Add nurbs object to blender, only support one type at the moment
@ -700,16 +713,16 @@ def get_float_func(filepath):
return float
def load_obj(filepath,
CLAMP_SIZE= 0.0,
CREATE_FGONS= True,
CREATE_SMOOTH_GROUPS= True,
CREATE_EDGES= True,
SPLIT_OBJECTS= True,
SPLIT_GROUPS= True,
SPLIT_MATERIALS= True,
ROTATE_X90= True,
IMAGE_SEARCH=True,
POLYGROUPS=False):
CLAMP_SIZE= 0.0,
CREATE_FGONS= True,
CREATE_SMOOTH_GROUPS= True,
CREATE_EDGES= True,
SPLIT_OBJECTS= True,
SPLIT_GROUPS= True,
SPLIT_MATERIALS= True,
ROTATE_X90= True,
IMAGE_SEARCH=True,
POLYGROUPS=False):
'''
Called by the user interface or another script.
load_obj(path) - should give acceptable results.
@ -997,30 +1010,30 @@ def load_obj(filepath,
create_mesh(scn, new_objects, has_ngons, CREATE_FGONS, CREATE_EDGES, verts_loc_split, verts_tex, faces_split, unique_materials_split, unique_material_images, unique_smooth_groups, vertex_groups, dataname)
# nurbs support
for context_nurbs in nurbs:
create_nurbs(scn, context_nurbs, verts_loc, new_objects)
# for context_nurbs in nurbs:
# create_nurbs(scn, context_nurbs, verts_loc, new_objects)
axis_min= [ 1000000000]*3
axis_max= [-1000000000]*3
if CLAMP_SIZE:
# Get all object bounds
for ob in new_objects:
for v in ob.getBoundBox():
for axis, value in enumerate(v):
if axis_min[axis] > value: axis_min[axis]= value
if axis_max[axis] < value: axis_max[axis]= value
# if CLAMP_SIZE:
# # Get all object bounds
# for ob in new_objects:
# for v in ob.getBoundBox():
# for axis, value in enumerate(v):
# if axis_min[axis] > value: axis_min[axis]= value
# if axis_max[axis] < value: axis_max[axis]= value
# Scale objects
max_axis= max(axis_max[0]-axis_min[0], axis_max[1]-axis_min[1], axis_max[2]-axis_min[2])
scale= 1.0
# # Scale objects
# max_axis= max(axis_max[0]-axis_min[0], axis_max[1]-axis_min[1], axis_max[2]-axis_min[2])
# scale= 1.0
while CLAMP_SIZE < max_axis * scale:
scale= scale/10.0
# while CLAMP_SIZE < max_axis * scale:
# scale= scale/10.0
for ob in new_objects:
ob.setSize(scale, scale, scale)
# for ob in new_objects:
# ob.setSize(scale, scale, scale)
# Better rotate the vert locations
#if not ROTATE_X90:
@ -1276,5 +1289,10 @@ else:
# NOTES (all line numbers refer to 2.4x import_obj.py, not this file)
# check later: line 489
# edge flags, edges, normals: lines 508-528
# vertex groups: line 533 - cannot assign vertex groups
# can convert now: edge flags, edges: lines 508-528
# ngon (uses python module BPyMesh): 384-414
# nurbs: 947-
# clamp size: cannot get bound box with RNA - neither I can write RNA struct function that returns it -
# again, RNA limitation
# warning: uses bpy.sys.exists
# get back to l 140 (here)

@ -1911,7 +1911,7 @@ RNAProcessItem PROCESS_ITEMS[]= {
{"rna_lamp.c", NULL, RNA_def_lamp},
{"rna_lattice.c", NULL, RNA_def_lattice},
{"rna_main.c", "rna_main_api.c", RNA_def_main},
{"rna_material.c", NULL, RNA_def_material},
{"rna_material.c", "rna_material_api.c", RNA_def_material},
{"rna_mesh.c", "rna_mesh_api.c", RNA_def_mesh},
{"rna_meta.c", NULL, RNA_def_meta},
{"rna_modifier.c", NULL, RNA_def_modifier},

@ -193,6 +193,7 @@ void RNA_api_object(struct StructRNA *srna);
void RNA_api_ui_layout(struct StructRNA *srna);
void RNA_api_wm(struct StructRNA *srna);
void RNA_api_scene(struct StructRNA *srna);
void RNA_api_material(StructRNA *srna);
/* ID Properties */

@ -40,6 +40,7 @@
#include "BKE_mesh.h"
#include "BKE_library.h"
#include "BKE_object.h"
#include "BKE_material.h"
#include "DNA_mesh_types.h"
@ -68,7 +69,7 @@ static Object* rna_Main_add_object(Main *main, int type, char *name)
}
/*
WARNING: the following example shows when this function should not be called
NOTE: the following example shows when this function should _not_ be called
ob = bpy.data.add_object()
scene.add_object(ob)
@ -87,6 +88,20 @@ static void rna_Main_remove_object(Main *main, ReportList *reports, Object *ob)
BKE_report(reports, RPT_ERROR, "Object must have zero users to be removed.");
}
static Material *rna_Main_add_material(Main *main, char *name)
{
return add_material(name);
}
/* TODO: remove material? */
struct Tex *rna_Main_add_texture(Main *main, char *name)
{
return add_texture(name);
}
/* TODO: remove texture? */
#else
void RNA_api_main(StructRNA *srna)
@ -136,6 +151,19 @@ void RNA_api_main(StructRNA *srna)
RNA_def_function_ui_description(func, "Remove a mesh if it has zero users.");
parm= RNA_def_pointer(func, "mesh", "Mesh", "", "Mesh to remove.");
RNA_def_property_flag(parm, PROP_REQUIRED);
func= RNA_def_function(srna, "add_material", "rna_Main_add_material");
RNA_def_function_ui_description(func, "Add a new material.");
parm= RNA_def_string(func, "name", "Material", 0, "", "New name for the datablock."); /* optional */
parm= RNA_def_pointer(func, "material", "Material", "", "New material.");
RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "add_texture", "rna_Main_add_texture");
RNA_def_function_ui_description(func, "Add a new texture.");
parm= RNA_def_string(func, "name", "Tex", 0, "", "New name for the datablock."); /* optional */
parm= RNA_def_pointer(func, "texture", "Texture", "", "New texture.");
RNA_def_function_return(func, parm);
}
#endif

@ -1134,6 +1134,8 @@ void RNA_def_material(BlenderRNA *brna)
rna_def_material_sss(brna);
rna_def_material_mtex(brna);
rna_def_material_strand(brna);
RNA_api_material(srna);
}
void rna_def_mtex_common(StructRNA *srna, const char *begin, const char *activeget, const char *structname)

@ -0,0 +1,126 @@
/**
*
*
* ***** BEGIN GPL 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.
*
* 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) 2009 Blender Foundation.
* All rights reserved.
*
*
* Contributor(s): Blender Foundation
*
* ***** END GPL LICENSE BLOCK *****
*/
#include <stdlib.h>
#include <stdio.h>
#include "RNA_define.h"
#include "RNA_types.h"
#include "DNA_material_types.h"
#ifdef RNA_RUNTIME
#include "BKE_material.h"
#include "BKE_texture.h"
/*
Adds material to the first free texture slot.
If all slots are busy, replaces the first.
*/
static void rna_Material_add_texture(Material *ma, Tex *tex, int mapto, int texco)
{
int i;
MTex *mtex;
int slot= -1;
for (i= 0; i < MAX_MTEX; i++) {
if (!ma->mtex[i]) {
slot= i;
break;
}
}
if (slot == -1)
slot= 0;
if (ma->mtex[slot]) {
ma->mtex[slot]->tex->id.us--;
}
else {
ma->mtex[slot]= add_mtex();
}
mtex= ma->mtex[slot];
mtex->tex= tex;
id_us_plus(&tex->id);
mtex->texco= mapto;
mtex->mapto= texco;
}
#else
void RNA_api_material(StructRNA *srna)
{
FunctionRNA *func;
PropertyRNA *parm;
/* copied from rna_def_material_mtex (rna_material.c) */
static EnumPropertyItem prop_texture_coordinates_items[] = {
{TEXCO_GLOB, "GLOBAL", 0, "Global", "Uses global coordinates for the texture coordinates."},
{TEXCO_OBJECT, "OBJECT", 0, "Object", "Uses linked object's coordinates for texture coordinates."},
{TEXCO_UV, "UV", 0, "UV", "Uses UV coordinates for texture coordinates."},
{TEXCO_ORCO, "ORCO", 0, "Generated", "Uses the original undeformed coordinates of the object."},
{TEXCO_STRAND, "STRAND", 0, "Strand", "Uses normalized strand texture coordinate (1D)."},
{TEXCO_STICKY, "STICKY", 0, "Sticky", "Uses mesh's sticky coordinates for the texture coordinates."},
{TEXCO_WINDOW, "WINDOW", 0, "Window", "Uses screen coordinates as texture coordinates."},
{TEXCO_NORM, "NORMAL", 0, "Normal", "Uses normal vector as texture coordinates."},
{TEXCO_REFL, "REFLECTION", 0, "Reflection", "Uses reflection vector as texture coordinates."},
{TEXCO_STRESS, "STRESS", 0, "Stress", "Uses the difference of edge lengths compared to original coordinates of the mesh."},
{TEXCO_TANGENT, "TANGENT", 0, "Tangent", "Uses the optional tangent vector as texture coordinates."},
{0, NULL, 0, NULL, NULL}};
static EnumPropertyItem prop_texture_mapto_items[] = {
{MAP_COL, "COLOR", 0, "Color", "Causes the texture to affect basic color of the material"},
{MAP_NORM, "NORMAL", 0, "Normal", "Causes the texture to affect the rendered normal"},
{MAP_COLSPEC, "SPEC_COLOR", 0, "Specularity Color", "Causes the texture to affect the specularity color"},
{MAP_COLMIR, "MIRROR", 0, "Mirror", "Causes the texture to affect the mirror color"},
{MAP_REF, "REFLECTION", 0, "Reflection", "Causes the texture to affect the value of the materials reflectivity"},
{MAP_SPEC, "SPECULARITY", 0, "Specularity", "Causes the texture to affect the value of specularity"},
{MAP_EMIT, "EMIT", 0, "Emit", "Causes the texture to affect the emit value"},
{MAP_ALPHA, "ALPHA", 0, "Alpha", "Causes the texture to affect the alpha value"},
{MAP_HAR, "HARDNESS", 0, "Hardness", "Causes the texture to affect the hardness value"},
{MAP_RAYMIRR, "RAY_MIRROR", 0, "Ray-Mirror", "Causes the texture to affect the ray-mirror value"},
{MAP_TRANSLU, "TRANSLUCENCY", 0, "Translucency", "Causes the texture to affect the translucency value"},
{MAP_AMB, "AMBIENT", 0, "Ambient", "Causes the texture to affect the value of ambient"},
{MAP_DISPLACE, "DISPLACEMENT", 0, "Displacement", "Let the texture displace the surface"},
{MAP_WARP, "WARP", 0, "Warp", "Let the texture warp texture coordinates of next channels"},
{0, NULL, 0, NULL, NULL}};
func= RNA_def_function(srna, "add_texture", "rna_Material_add_texture");
RNA_def_function_ui_description(func, "Add a texture to material's free texture slot.");
parm= RNA_def_pointer(func, "texture", "Texture", "", "Texture to add.");
parm= RNA_def_enum(func, "texture_coordinates", prop_texture_coordinates_items, TEXCO_UV, "", "Source of texture coordinate information."); /* optional */
parm= RNA_def_enum(func, "map_to", prop_texture_mapto_items, MAP_COL, "", "Controls which material property the texture affects."); /* optional */
}
#endif

@ -253,6 +253,11 @@ static void rna_Mesh_add_uv_layer(Mesh *me)
me->mtface= CustomData_add_layer(&me->fdata, CD_MTFACE, CD_DEFAULT, NULL, me->totface);
}
static void rna_Mesh_calc_normals(Mesh *me)
{
mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
}
#else
void RNA_api_mesh(StructRNA *srna)
@ -281,6 +286,9 @@ void RNA_api_mesh(StructRNA *srna)
func= RNA_def_function(srna, "add_uv_layer", "rna_Mesh_add_uv_layer");
RNA_def_function_ui_description(func, "Add new UV layer to Mesh.");
func= RNA_def_function(srna, "calc_normals", "rna_Mesh_calc_normals");
RNA_def_function_ui_description(func, "Calculate vertex normals.");
/*
func= RNA_def_function(srna, "add_geom", "rna_Mesh_add_geom");
RNA_def_function_ui_description(func, "Add geometry data to mesh.");

@ -155,10 +155,15 @@ static void rna_Object_convert_to_triface(Object *ob, bContext *C, ReportList *r
DAG_object_flush_update(sce, ob, OB_RECALC_DATA);
}
static int rna_Object_add_vertex_group(Object *ob, char *group_name)
static bDeformGroup *rna_Object_add_vertex_group(Object *ob, char *group_name)
{
bDeformGroup *defgroup= add_defgroup_name(ob, group_name);
return BLI_findindex(&ob->defbase, defgroup);
return add_defgroup_name(ob, group_name);
}
static void rna_Object_add_vertex_to_group(Object *ob, int vertex_index, bDeformGroup *def, float weight, int assignmode)
{
/* creates dverts if needed */
add_vert_to_defgroup(ob, def, vertex_index, weight, assignmode);
}
/*
@ -210,6 +215,13 @@ void RNA_api_object(StructRNA *srna)
{0, NULL, 0, NULL, NULL}
};
static EnumPropertyItem assign_mode_items[] = {
{WEIGHT_REPLACE, "REPLACE", 0, "Replace", "Replace."}, /* TODO: more meaningful descriptions */
{WEIGHT_ADD, "ADD", 0, "Add", "Add."},
{WEIGHT_SUBTRACT, "SUBTRACT", 0, "Subtract", "Subtract."},
{0, NULL, 0, NULL, NULL}
};
func= RNA_def_function(srna, "create_mesh", "rna_Object_create_mesh");
RNA_def_function_ui_description(func, "Create a Mesh datablock with all modifiers applied.");
RNA_def_function_flag(func, FUNC_USE_CONTEXT|FUNC_USE_REPORTS);
@ -234,9 +246,20 @@ void RNA_api_object(StructRNA *srna)
func= RNA_def_function(srna, "add_vertex_group", "rna_Object_add_vertex_group");
RNA_def_function_ui_description(func, "Add vertex group to object.");
parm= RNA_def_string(func, "name", "Group", 0, "", "Vertex group name.");
parm= RNA_def_int(func, "group_index", 0, 0, 0, "", "Index of the created vertex group.", 0, 0);
parm= RNA_def_string(func, "name", "Group", 0, "", "Vertex group name."); /* optional */
parm= RNA_def_pointer(func, "group", "VertexGroup", "", "New vertex group.");
RNA_def_function_return(func, parm);
func= RNA_def_function(srna, "add_vertex_to_group", "rna_Object_add_vertex_to_group");
RNA_def_function_ui_description(func, "Add vertex to a vertex group.");
parm= RNA_def_int(func, "vertex_index", 0, 0, 0, "", "Vertex index.", 0, 0);
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_pointer(func, "group", "VertexGroup", "", "Vertex group to add vertex to.");
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_float(func, "weight", 0, 0.0f, 1.0f, "", "Vertex weight.", 0.0f, 1.0f);
RNA_def_property_flag(parm, PROP_REQUIRED);
parm= RNA_def_enum(func, "type", assign_mode_items, 0, "", "Vertex assign mode.");
RNA_def_property_flag(parm, PROP_REQUIRED);
}
#endif