﻿<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=Dev%3ASource%2FModeling%2FSculpting_Tools</id>
	<title>Dev:Source/Modeling/Sculpting Tools - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=Dev%3ASource%2FModeling%2FSculpting_Tools"/>
	<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Dev:Source/Modeling/Sculpting_Tools&amp;action=history"/>
	<updated>2026-06-07T21:15:22Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=Dev:Source/Modeling/Sculpting_Tools&amp;diff=47390&amp;oldid=prev</id>
		<title>Yamyam: 1版 をインポートしました</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Dev:Source/Modeling/Sculpting_Tools&amp;diff=47390&amp;oldid=prev"/>
		<updated>2018-06-28T17:47:45Z</updated>

		<summary type="html">&lt;p&gt;1版 をインポートしました&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;2018年6月28日 (木) 17:47時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ja&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(相違点なし)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Yamyam</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=Dev:Source/Modeling/Sculpting_Tools&amp;diff=47389&amp;oldid=prev</id>
		<title>2010年4月3日 (土) 12:42にwiki&gt;Terrywallworkによる</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Dev:Source/Modeling/Sculpting_Tools&amp;diff=47389&amp;oldid=prev"/>
		<updated>2010-04-03T12:42:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Overview ==&lt;br /&gt;
The sculpting tool works as a seperate mode, called Sculpt Mode. I have written a small implementation of this design, and it works fairly well.&lt;br /&gt;
&lt;br /&gt;
== Globals ==&lt;br /&gt;
In BKE_global.h:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 struct SculptData* sculptdata;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The sculptdata pointer is initialized on startup and contains all the global sculpting data.&lt;br /&gt;
&lt;br /&gt;
Also in BKE_global.h, a new G.f flag to toggle Sculpt Mode:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 #define G_SCULPTMODE    (1 &amp;lt;&amp;lt; 26)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Structs ==&lt;br /&gt;
=== Defined in BDR_sculptmode.h ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 typedef struct BrushData&lt;br /&gt;
 {&lt;br /&gt;
 	short size, strength;&lt;br /&gt;
 	short dir;&lt;br /&gt;
 } BrushData;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct SculptData&lt;br /&gt;
 {&lt;br /&gt;
 	BrushData drawbrush, smoothbrush, pinchbrush;&lt;br /&gt;
 &lt;br /&gt;
 	BrushData *currentbrush;&lt;br /&gt;
 	short brush_type;&lt;br /&gt;
 &lt;br /&gt;
 	short symm_x, symm_y, symm_z;&lt;br /&gt;
 &lt;br /&gt;
 	Mesh *active_mesh;&lt;br /&gt;
 &lt;br /&gt;
 	ListBase *vertex_users;&lt;br /&gt;
 	int vertex_users_size;&lt;br /&gt;
 &lt;br /&gt;
 	char *face_flags;&lt;br /&gt;
 &lt;br /&gt;
 	short use_tex;&lt;br /&gt;
 	struct Tex *tex;&lt;br /&gt;
 	short tex_nr;&lt;br /&gt;
 &lt;br /&gt;
 	double modelviewmat[16];&lt;br /&gt;
 	double projectionmat[16];&lt;br /&gt;
 	int viewport[4];&lt;br /&gt;
 } SculptData;&lt;br /&gt;
 &lt;br /&gt;
 /* SculptData brushtype */&lt;br /&gt;
 #define DRAW_BRUSH 1&lt;br /&gt;
 #define SMOOTH_BRUSH 2&lt;br /&gt;
 #define PINCH_BRUSH 3&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The BrushData struct simply stores all the settings that can be changed for each brush. Brush settings that are the same for all brushes, like symmetry, are in SculptData.&lt;br /&gt;
&lt;br /&gt;
active_mesh is set whenever the mesh changes, including entering/exiting Sculpt Mode, and when switching from one mesh to another by right clicking.&lt;br /&gt;
&lt;br /&gt;
SculptData also stores vertex_users, which is an array that matches the size of the mvert array in the current Mesh. The elements in the array are lists of the faces that use that vertex. It's necessary to cache this data to speed up some of the calculations.&lt;br /&gt;
&lt;br /&gt;
The face_flags array in SculptData is used to store copies of all the MFace.flag fields.&lt;br /&gt;
&lt;br /&gt;
The three tex fields are used to manipulate the brush shape with a texture.&lt;br /&gt;
&lt;br /&gt;
modelviewmat, projectionmat, and viewport are simply cached values from OpenGl.&lt;br /&gt;
&lt;br /&gt;
=== Defined in sculptmode.c ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 typedef struct IndexNode {&lt;br /&gt;
 	struct IndexNode* next,* prev;&lt;br /&gt;
 	int Index;&lt;br /&gt;
 } IndexNode;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct ActiveData {&lt;br /&gt;
 	unsigned int Index;&lt;br /&gt;
 	float Fade;&lt;br /&gt;
 } ActiveData;&lt;br /&gt;
 &lt;br /&gt;
 typedef struct EditData {&lt;br /&gt;
 	vec3f center;&lt;br /&gt;
 	float size;&lt;br /&gt;
 &lt;br /&gt;
 	vec3f up, right;&lt;br /&gt;
 } EditData;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
IndexNode is just used for vertex_users, as an index into the mface array in Mesh.&lt;br /&gt;
&lt;br /&gt;
ActiveData stores an Index into the mvert array in Mesh, and also Fade, which stores how much the brush affects that particular vertex, scaled to the range [0,1].&lt;br /&gt;
&lt;br /&gt;
EditData stores data about the brush. When symmetry is enabled, copies of EditData are made to flip the location (center) and normals (up, right) of the brush.&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
All the functions are defined in src/sculptmode.c. '''init_sculpt_data()''', '''free_sculpt_data()''', '''sculptmode_update_tex()''', '''sculpt()''', '''set_sculptmesh()''', and '''set_sculptmode()''' are declared in include/BDR_sculptmode.h, but the rest are not, since they aren't used anywhere but sculptmode.c.&lt;br /&gt;
&lt;br /&gt;
=== Memory/Initialization ===&lt;br /&gt;
&lt;br /&gt;
==== init_sculpt_data() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void init_sculpt_data();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The global data (G.sculptdata) is allocated and initialized in '''BIF_init()''' with this function:&lt;br /&gt;
&lt;br /&gt;
==== free_sculpt_data() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void free_sculpt_data();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The global data is deleted in '''exit_usiblender()''' with this function:&lt;br /&gt;
&lt;br /&gt;
==== free_vertexusers() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void free_vertexusers();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There is also a seperate function to free the vertex_user data, since this happens not only at program shutdown, but other times as well:&lt;br /&gt;
&lt;br /&gt;
==== calc_vertex_users() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void calc_vertex_users();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Initializes the G.sculptdata-&amp;gt;vertex_users array. The array size is Mesh.totvert; each element in the array is a linked list of IndexNodes, which contain an index into the Mesh.mface array. vertex_users can then be used to quickly find all the faces that use a particular vertex.&lt;br /&gt;
&lt;br /&gt;
==== copy_face_flags() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void copy_face_flags();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function is called every time the user enters Sculpt Mode. It's needed so that all the faces in the Mesh can be temporarily set to smooth while sculpting. MFace.flag is copied for each face into the G.sculptdata-&amp;gt;face_flags array, then each MFace flag gets ME_SMOOTH added to it.&lt;br /&gt;
&lt;br /&gt;
The reasons for setting all of the faces to smooth is that the [[#calc_damaged_verts()|'''calc_damaged_verts()''']] is used to quickly calculate vertex normals, but I think it would be tricky to pass the face normals to the displaylist mesh. And as my mentor pointed out, why would you want to sculpt on an unsmoothed mesh?&lt;br /&gt;
&lt;br /&gt;
==== restore_face_flags() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void restore_face_flags();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Called whenever the user exits Sculpt Mode; it simply restores the MFace.flag values to the ones stored in G.sculptdata-&amp;gt;face_flags.&lt;br /&gt;
&lt;br /&gt;
==== set_sculptmesh() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void set_sculptmesh(Mesh *me);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function is called any time the active_mesh needs to be set, including setting it to NULL on exiting sculpt mode.&lt;br /&gt;
&lt;br /&gt;
This function also takes care of some initialization and finalization: [[#calc_vertex_users()|'''calc_vertex_users()''']] and [[#copy_face_flags()|'''copy_face_flags()''']] are called to fill G.sculptdata-&amp;gt;vertex_users and G.sculptdata-&amp;gt;face_flags, respectively.&lt;br /&gt;
&lt;br /&gt;
On setting active_mesh to NULL, [[#restore_face_flags()|'''restore_face_flags()''']] is called.&lt;br /&gt;
&lt;br /&gt;
=== OpenGL ===&lt;br /&gt;
&lt;br /&gt;
A couple of simple OpenGL-related functions:&lt;br /&gt;
&lt;br /&gt;
==== init_sculptmatrices() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void init_sculptmatrices();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sets modelviewmat, projectionmat, and viewport, which are used for '''unproject()'''.&lt;br /&gt;
&lt;br /&gt;
==== get_depth() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 float get_depth(short x, short y);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uses window coordinates (x,y) to find the depth in the GL depth buffer.&lt;br /&gt;
&lt;br /&gt;
==== unproject() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 vec3f unproject(const short x, const short y, const float z);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uses window coordinates (x,y) and depth component z to find a point in model space.&lt;br /&gt;
&lt;br /&gt;
==== sculptmode_paint_brush() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt; &lt;br /&gt;
void sculptmode_paint_brush();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Paints a circle around the cursor to show the brush.&lt;br /&gt;
&lt;br /&gt;
=== Sculpting ===&lt;br /&gt;
&lt;br /&gt;
==== brush_strength() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 float brush_strength();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function combines the brush strength, the brush direction, and a scaling factor to produce a single strength factor for the brush, which controls how strongly, and in which direction, the brush affects vertices.&lt;br /&gt;
&lt;br /&gt;
==== set_sculptmode() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void set_sculptmode();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function does the same thing as '''set_vpaint()''', '''set_wpaint()''', etc: it toggles sculptmode on and off. Whether sculptmode is on or not is controlled by adding G_SCULPTMODE to the G.f flag.&lt;br /&gt;
&lt;br /&gt;
This function calls [[#set_sculptmesh()|'''set_sculptmesh()''']] to do initialization.&lt;br /&gt;
&lt;br /&gt;
==== sculpt() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void sculpt();&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The interesting stuff starts here. A detailed overview of how it works:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Push an &amp;quot;undo&amp;quot; with '''BIF_undo_push'''&lt;br /&gt;
# [[#init_sculptmatrices()|'''init_sculptmatrices()''']&lt;br /&gt;
# Check whether there are modifiers enabled: modifier_calculations= modifiers_getVirtualModifierList(ob) != NULL;&lt;br /&gt;
# Go into a loop that will end on mouse up&lt;br /&gt;
## [[#init_editdata()|'''init_editdata()''']] is called to set up the brush.&lt;br /&gt;
## If modifier_calculations is true, call '''mesh_get_mapped_verts_nors()'''. The mapped data it returns is passed to '''do_symmetrical_brush_actions()'''.&lt;br /&gt;
## [[#do_symmetrical_brush_actions()|'''do_symmetrical_brush_actions()''']] is called. &lt;br /&gt;
## If modifier_calculations is true, call '''DAG_object_flush_update()''' to update the normals and to apply the modifiers to the new vertex coordinates. If modifier_calculations is false, call [[#calc_damaged_verts()|'''calc_damaged_verts()''']].&lt;br /&gt;
## [[#sculptmode_paint_brush()|'''sculptmode_paint_brush()''']]&lt;br /&gt;
## Refresh the screen&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== init_editdata() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void init_editdata(EditData *e, short *mouse);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The function sets up EditData. First, the location and size of the brush are scaled to match the size of the model on screen. The reason for this is that setting a brush size of 50 would mean a totally different thing if you had a sphere 100 Blender-Units wide than if the sphere was 1BU. Instead of that, the user selects the brush size (actually, it's the brush radius) in pixels. [[#get_depth()|'''get_depth()''']] and [[#unproject()|'''unproject()''']] are used to convert from view coordinates to model coordinates.&lt;br /&gt;
&lt;br /&gt;
This function also sets the Up and Right normals. These indicate which way 'up' and 'right' are when transformed from view to model coordinates. These are important when using a texture as a brush shape.&lt;br /&gt;
&lt;br /&gt;
==== do_symmetrical_brush_actions() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void do_symmetrical_brush_actions(float *vertexcosnos, EditData *e,&lt;br /&gt;
 				  ListBase *damaged_verts);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function calls [[#do_brush_action()|'''do_brush_action()''']] at least once. If symmetry is enabled, [[#do_brush_action()|'''do_brush_action()''']] is called again, multiple times if necessary. In order to make symmetrical dots, [[#flip_editdata()|'''flip_editdata()''']] is used to flip the brush across the model, which then passed directly to [[#do_brush_action()|'''do_brush_action()''']].&lt;br /&gt;
&lt;br /&gt;
==== flip_editdata() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 EditData flip_editdata(EditData *e, short x, short y, short z);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flips the brush location, plus the two view directions, up and right, across the axes indicated by the values of x, y, and z.&lt;br /&gt;
&lt;br /&gt;
==== do_brush_action() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void do_brush_action(float *vertexcosnos, EditData e,&lt;br /&gt;
 		     ListBase *damaged_verts);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function starts by building a linked list of &amp;quot;active_verts&amp;quot;, which contains all the vertices that will be modified by the brush, found by taking the distance of each vertex from the center of the brush. The vertices are stored in the list using the ActiveData structure, which contains the Index field for the index of the vertex, plus &amp;quot;Fade&amp;quot;, which stores the strength the brush will have on that vertex. For example, using the default settings, a vertex right at the center of the brush would have a Fade of 1, whereas a vertex at the edge would have a Fade of 0.&lt;br /&gt;
&lt;br /&gt;
How Fade is calculated is determined by the G.sculptdata-&amp;gt;use_tex flag. If set to false, then a simple cosine curve is used to shape the brush, which give a smooth curve with a gentle falloff. If use_tex is true, then the user is given the option of selecting a texture. This texture is then used to find the strength of the brush for each vertex: [[#tex_strength()|'''tex_strength()''']]&lt;br /&gt;
&lt;br /&gt;
Once the active_verts have been found, the appropriate do_X_brush() function is called. Currently, the available choices are '''do_draw_brush()''', '''do_smooth_brush()''', and '''do_pinch_brush()'''.&lt;br /&gt;
&lt;br /&gt;
==== tex_strength() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 float tex_strength(EditData *e, float *point, const float len);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function uses the texture G.sculptdata-&amp;gt;tex to find the strength of the brush for a particular vertex. It does this by converting the 3D location of the vertex into 2D polar coordinates. Basically, the up and right vectors are used to define the 2D plane. The magnitude component is scaled to the size of the image from which the strength will be calculated. The polar coordinates can then be converted to find one pixel in the texture.&lt;br /&gt;
&lt;br /&gt;
It currently makes very limited use of Blender's textures; the texture must contain an image, and that's what's used.&lt;br /&gt;
&lt;br /&gt;
==== calc_damaged_verts() ====&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 void calc_damaged_verts(ListBase *damaged_verts);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This function loops through all the damaged_verts and, using the vertex_users connectivity data, calculates a new normal for each vertex that has been modified by the last brush action.&lt;br /&gt;
&lt;br /&gt;
== Interface ==&lt;br /&gt;
&amp;quot;Sculpt Mode&amp;quot; is added to the mode popup in src/header_view3d. (Specifically, this required changes to '''view3d_modeselect_pup()''', '''do_view3d_buttons()''', and '''view3d_buttons'''.)&lt;br /&gt;
&lt;br /&gt;
The interface for Sculpt Mode is created in '''editing_panel_sculpting_tools()''', which is defined in buttons_editing.h. Most of the buttons simply change data in G.sculptdata, but the buttons that switch the brush type have to change a pointer and redraw the editing buttons, so they return the value B_SCULPT_BRUSHTYPE. (At the suggestion of my mentor, I placed this value within the B_FPAINTBUTS section, set to 2860.)&lt;br /&gt;
&lt;br /&gt;
Other changes to the interface: in '''editing_panel_links()''', the Set Smooth/Set Solid buttons are now hidden in Sculpt Mode. (See [[#copy_face_flags()|'''copy_face_flags()''']] for the explanation.) The transform widget is also deactivated on entering Sculpt Mode.&lt;br /&gt;
&lt;br /&gt;
== Problems ==&lt;br /&gt;
There are some problems that need to be resolved with the design&lt;br /&gt;
* The brush doesn't respond to tablet pressure.&lt;br /&gt;
&lt;br /&gt;
[[Category:Sculpting]]&lt;br /&gt;
[[Category:Tools]]&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Script]]&lt;/div&gt;</summary>
		<author><name>wiki&gt;Terrywallwork</name></author>
		
	</entry>
</feed>