﻿<?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=%E5%88%A9%E7%94%A8%E8%80%85%3ASionix%2FSummerOfCode2006%2FClouds</id>
	<title>利用者:Sionix/SummerOfCode2006/Clouds - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=%E5%88%A9%E7%94%A8%E8%80%85%3ASionix%2FSummerOfCode2006%2FClouds"/>
	<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sionix/SummerOfCode2006/Clouds&amp;action=history"/>
	<updated>2026-06-30T00:47:02Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sionix/SummerOfCode2006/Clouds&amp;diff=51860&amp;oldid=prev</id>
		<title>Yamyam: 1版 をインポートしました</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sionix/SummerOfCode2006/Clouds&amp;diff=51860&amp;oldid=prev"/>
		<updated>2018-06-28T17:49:59Z</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:49時点における版&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=%E5%88%A9%E7%94%A8%E8%80%85:Sionix/SummerOfCode2006/Clouds&amp;diff=51859&amp;oldid=prev</id>
		<title>wiki&gt;Sionix: /* Cloud engine */</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Sionix/SummerOfCode2006/Clouds&amp;diff=51859&amp;oldid=prev"/>
		<updated>2006-09-28T00:07:27Z</updated>

		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Cloud engine&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Clouds =&lt;br /&gt;
[ [[User:Sionix/SummerOfCode2006|Back to the project]] ] [ http://sionix.pbwiki.com/SummerOfCode2006_Screenshots ]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How it works and User interface ==&lt;br /&gt;
Cloud building is based on modelling cloud shapes via closed meshes.&lt;br /&gt;
&lt;br /&gt;
Basic steps are:&lt;br /&gt;
&lt;br /&gt;
1. Create cloud shape&lt;br /&gt;
&lt;br /&gt;
2. Fill shape with particles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Usage examples ==&lt;br /&gt;
&lt;br /&gt;
[[User:Sionix/SummerOfCode2006/CloudsTutorials|Go to tutorials]]&lt;br /&gt;
&lt;br /&gt;
== Programming interface ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Integration into pipeline ===&lt;br /&gt;
&lt;br /&gt;
Cloud part of SkyGen is integrated into three Blender areas:&lt;br /&gt;
&lt;br /&gt;
* 3D browser&lt;br /&gt;
&lt;br /&gt;
* UI&lt;br /&gt;
&lt;br /&gt;
* convertblender&lt;br /&gt;
&lt;br /&gt;
'''3D browser''' is provided with draw_cloud function that displays draft view of the cloud.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void draw_cloud(Object *ob, CloudEff *clf)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
draw_cloud:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@param[in] ob Mesh object.&lt;br /&gt;
@param[in] clf Cloud effect, attached to the mesh.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''UI''' - buttons_object is provided with cloud panel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void object_panel_clouds(Object *ob)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
object_panel_clouds:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@param[in] ob Mesh object.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''convertblender''' is the place where all cloud conversion processes are playing their roles. render_cloud converts CloudEff to the particle set.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void render_cloud(Render *re, Object *ob, CloudEff *clf)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
render_cloud:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@param[in] re Main Render database.&lt;br /&gt;
@param[in] ob Mesh object with cloud.&lt;br /&gt;
@param[in] clf Cloud effect attached to the mesh.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Objects and relations ===&lt;br /&gt;
&lt;br /&gt;
==== DNA objects ====&lt;br /&gt;
&lt;br /&gt;
The following structure represents a single cloud object attached to the mesh. It behaves almost the same as PartEff.&lt;br /&gt;
&lt;br /&gt;
First fields are for general effect purposes.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
typedef struct CloudEff {&lt;br /&gt;
	struct CloudEff *next, *prev;&lt;br /&gt;
	short type, flag, buttype, stype, vertgroup, userjit;&lt;br /&gt;
&amp;lt;/pre&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
Following are for particle control.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	int totpart, totkey, seed;&lt;br /&gt;
	float imat[4][4];	&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Next fields are pure cloud-specific:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	// Cell size in world metrics.&lt;br /&gt;
	float cell_size;&lt;br /&gt;
	// Possibilities for vertical dissolving.&lt;br /&gt;
	float pos_solid, pos_vapor, pos_none;	&lt;br /&gt;
	// Particle density at top and bottom layers.&lt;br /&gt;
	float dens_top, dens_bottom;			&lt;br /&gt;
	// Scattering params.	&lt;br /&gt;
	float scat_start, scat_end, scat_width;	&lt;br /&gt;
	// Texture mapping type and texture id.&lt;br /&gt;
	short eff_type, tex_id;&lt;br /&gt;
	// Blur multiplicitier.&lt;br /&gt;
	short blur_cnt, pad1;&lt;br /&gt;
	// Build check - mesh &amp;quot;hash&amp;quot; value based on geometry.&lt;br /&gt;
	float build_check; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
Last ones represent particle data itself.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
	Particle *keys;&lt;br /&gt;
	struct Group *group;&lt;br /&gt;
	&lt;br /&gt;
} CloudEff;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Interface functions ====&lt;br /&gt;
&lt;br /&gt;
Library C interface functions for using in other Blender modules.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
void BSG_prepareCloudParticles(struct Object *ob, struct Object *camera, &lt;br /&gt;
	struct World *wrld, struct CloudEff *clf, short stages);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BSG_prepareCloudParticles:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
@param[in] ob Mesh object - cloud shape.&lt;br /&gt;
@param[in] camera Current scene camera.&lt;br /&gt;
@param[in] wrld Current World object.&lt;br /&gt;
@param[in, out] clf Cloud effect object to be processed.&lt;br /&gt;
@param[in] stages Build stages to perform.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flags to define cloud build stages:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Perform only creation and arrangement step.&lt;br /&gt;
#define BUILD_STAGES_BUILD			1&lt;br /&gt;
// Perform light tracing and setup particles colors.&lt;br /&gt;
#define BUILD_STAGES_LIT			2&lt;br /&gt;
// Perform all stages.&lt;br /&gt;
#define BUILD_STAGES_ALL			0xff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Auxiliary templates ====&lt;br /&gt;
&lt;br /&gt;
'''Ref&amp;lt;T&amp;gt;''' - Class-holder for smart pointers system. Used for automatic control for object destruction.&lt;br /&gt;
&lt;br /&gt;
'''Array&amp;lt;T&amp;gt;''' - Helper dynamic array class, similar to STL's.&lt;br /&gt;
&lt;br /&gt;
==== Auxiliary mathematics ====&lt;br /&gt;
&lt;br /&gt;
Classes for geometry calculations.&lt;br /&gt;
&lt;br /&gt;
ConvexMesh class provides functionality for mesh processing.&lt;br /&gt;
&lt;br /&gt;
'''Note 1''': 'ConvexMesh' name is not fully correct now, class does not&lt;br /&gt;
represents a convex mesh.&lt;br /&gt;
&lt;br /&gt;
'''Note 2''': There is some rudimentary functionality, that was used&lt;br /&gt;
during several implementation tests and is not deleted while (I am not&lt;br /&gt;
including TrgOctree class into this description, because it is not used&lt;br /&gt;
in the pipeline now)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class ConvexMesh&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
	ConvexMesh();&lt;br /&gt;
&lt;br /&gt;
	void BuildMesh(TArray&amp;lt;Vect3f&amp;gt; *new_verts, float *verts, &lt;br /&gt;
		unsigned int *trgs, int numv, int numt);&lt;br /&gt;
	bool PointContains(const Vect3f &amp;amp;p);&lt;br /&gt;
	void GetAABB(Vect3f &amp;amp;vmin, Vect3f &amp;amp;vmax);&lt;br /&gt;
	inline Vect3f GetCenter();&lt;br /&gt;
&lt;br /&gt;
	const ConvexMesh &amp;amp;operator =(const ConvexMesh &amp;amp;cvm);&lt;br /&gt;
&lt;br /&gt;
	static void SplitToConvexMeshes(TArray&amp;lt;ConvexMesh&amp;gt; &amp;amp;cvms, float *_verts, &lt;br /&gt;
		unsigned int *_trgs, int _num_verts, int _num_trgs, &lt;br /&gt;
		bool only_closed_sep = false);&lt;br /&gt;
&lt;br /&gt;
	void GetOwnData(TArray&amp;lt;float&amp;gt; &amp;amp;v, TArray&amp;lt;unsigned int&amp;gt; &amp;amp;t);&lt;br /&gt;
&lt;br /&gt;
	inline float *Vertices();&lt;br /&gt;
	inline unsigned int *Triangles();&lt;br /&gt;
	inline int VerticesLength();&lt;br /&gt;
	inline int TrianglesLength();&lt;br /&gt;
&lt;br /&gt;
	int GetIntersectionsCount(const Vect3f &amp;amp;sp, const Vect3f &amp;amp;ep);&lt;br /&gt;
&lt;br /&gt;
protected:&lt;br /&gt;
	static void BuildNeighbourGraph();&lt;br /&gt;
	static int TraceNeighbour(int cur, int set_val);&lt;br /&gt;
	static void TestAndGetConvex(TArray&amp;lt;ConvexMesh&amp;gt; &amp;amp;cvms, &lt;br /&gt;
		TArray&amp;lt;Vect3f&amp;gt; *new_verts, int cur_marker, int mark_len);&lt;br /&gt;
	static void TraceConvex(TArray&amp;lt;int&amp;gt; &amp;amp;conv_mark_trgs, &lt;br /&gt;
		TArray&amp;lt;int&amp;gt; &amp;amp;border_trgs, int curt, int cur_marker);&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
	Ref&amp;lt;TArray&amp;lt;Vect3f&amp;gt; &amp;gt; m_verts;&lt;br /&gt;
	TArray&amp;lt;unsigned int&amp;gt; m_trgs;&lt;br /&gt;
	TArray&amp;lt;Vect3f&amp;gt; m_normals;&lt;br /&gt;
	Vect3f m_center;&lt;br /&gt;
&lt;br /&gt;
	Ref&amp;lt;TrgOctree&amp;gt; m_octree;&lt;br /&gt;
&lt;br /&gt;
	// Temp data&lt;br /&gt;
	static float *verts;&lt;br /&gt;
	static unsigned int *trgs;&lt;br /&gt;
	static int num_verts;&lt;br /&gt;
	static int num_trgs;&lt;br /&gt;
	static TArray&amp;lt;int&amp;gt; neigh_trgs;&lt;br /&gt;
	static TArray&amp;lt;int&amp;gt; mark_trgs;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Public methods:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/// Default constructor.&lt;br /&gt;
ConvexMesh::ConvexMesh()&lt;br /&gt;
&lt;br /&gt;
/// Assign vertex and triangles data to the object.&lt;br /&gt;
/// @param[in, out] new_verts Pointer to the vertex cache - shared&lt;br /&gt;
///    between several ConvexMesh objects parent data.&lt;br /&gt;
/// @param[in] verts Pointer to the vertices data - length is 3 * numv.&lt;br /&gt;
/// @param[in] trgs Pointer to the triangles data - length is numt.&lt;br /&gt;
/// @param[in] numv Number of vertices.&lt;br /&gt;
/// @param[in] numt Number of triangles * 3.&lt;br /&gt;
void ConvexMesh::BuildMesh(TArray&amp;lt;Vect3f&amp;gt; *new_verts, float *verts, &lt;br /&gt;
	unsigned int *trgs, int numv, int numt)&lt;br /&gt;
&lt;br /&gt;
/// Detect whether convex object contains a point.&lt;br /&gt;
/// @param[in] p A point.&lt;br /&gt;
/// @return True if point is inside of a convex object.&lt;br /&gt;
bool ConvexMesh::PointContains(const Vect3f &amp;amp;p)&lt;br /&gt;
&lt;br /&gt;
/// Get axis aligned bounding box for the object.&lt;br /&gt;
/// @param[out] vmin Lower-left-near corner's coordinates.&lt;br /&gt;
/// @param[out] vmax Upper-right-far corner's coordinates.&lt;br /&gt;
void ConvexMesh::GetAABB(Vect3f &amp;amp;vmin, Vect3f &amp;amp;vmax)&lt;br /&gt;
&lt;br /&gt;
/// Get object's center of mass.&lt;br /&gt;
/// @return Center location.&lt;br /&gt;
Vect3f ConvexMesh::GetCenter()&lt;br /&gt;
&lt;br /&gt;
/// Assignment operator.&lt;br /&gt;
/// @param[in] cvm Object to copy from.&lt;br /&gt;
/// @return Constant reference to this object.&lt;br /&gt;
const ConvexMesh &amp;amp;ConvexMesh::operator =(const ConvexMesh &amp;amp;cvm)&lt;br /&gt;
&lt;br /&gt;
/// The main function. Constructs array of ConvexMeshes from initial geometry&lt;br /&gt;
/// data.&lt;br /&gt;
/// @param[out] cvms Resulting array of ConvexMesh objects.&lt;br /&gt;
/// @param[in] _verts Pointer to vertices data, length is _num_verts * 3&lt;br /&gt;
/// @param[in] _trgs Pointer to triangles data.&lt;br /&gt;
/// @param[in] _num_verts Number of vertices.&lt;br /&gt;
/// @param[in] _num_trgs Number of triangles * 3.&lt;br /&gt;
/// @param[in] only_closed_sep Split only by closed parts.&lt;br /&gt;
static void ConvexMesh::SplitToConvexMeshes(TArray&amp;lt;ConvexMesh&amp;gt; &amp;amp;cvms, float *_verts, &lt;br /&gt;
	unsigned int *_trgs, int _num_verts, int _num_trgs, &lt;br /&gt;
	bool only_closed_sep)&lt;br /&gt;
&lt;br /&gt;
/// Get geometry data.&lt;br /&gt;
/// @param[out] v Vertices.&lt;br /&gt;
/// @param[out] t Triangles.&lt;br /&gt;
void ConvexMesh::GetOwnData(TArray&amp;lt;float&amp;gt; &amp;amp;v, TArray&amp;lt;unsigned int&amp;gt; &amp;amp;t)&lt;br /&gt;
&lt;br /&gt;
/// Quick access to data.&lt;br /&gt;
float *ConvexMesh::Vertices()&lt;br /&gt;
unsigned int *ConvexMesh::Triangles()&lt;br /&gt;
int ConvexMesh::VerticesLength()&lt;br /&gt;
int ConvexMesh::TrianglesLength()&lt;br /&gt;
&lt;br /&gt;
/// Calculate ConvexMesh vs segmet intersections count.&lt;br /&gt;
/// @param[in] sp Segment start point.&lt;br /&gt;
/// @param[in] ep Segment end point.&lt;br /&gt;
/// @return Count of intersections.&lt;br /&gt;
int ConvexMesh::GetIntersectionsCount(const Vect3f &amp;amp;sp, const Vect3f &amp;amp;ep)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Class CellBox provides voxelization functionality.&lt;br /&gt;
&lt;br /&gt;
It has three-dimensional matrix to hold particles' ids.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class CellBox&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
	CellBox();&lt;br /&gt;
	~CellBox();&lt;br /&gt;
&lt;br /&gt;
	bool Allocate(int _x, int _y, int _z);&lt;br /&gt;
	void Clear();&lt;br /&gt;
	void Set(int v);&lt;br /&gt;
	inline int &amp;amp;operator ()(int i, int j, int k);&lt;br /&gt;
	inline float &amp;amp;Height(int i, int j);&lt;br /&gt;
&lt;br /&gt;
	inline int X();&lt;br /&gt;
	inline int Y();&lt;br /&gt;
	inline int Z();&lt;br /&gt;
	inline int DataSize();&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
	int *data;&lt;br /&gt;
	float *height;&lt;br /&gt;
	int x, y, z;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Methods description:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/// Default constructor.&lt;br /&gt;
CellBox::CellBox()&lt;br /&gt;
&lt;br /&gt;
/// Destructor.&lt;br /&gt;
~CellBox::CellBox()&lt;br /&gt;
&lt;br /&gt;
/// Allocate memory for a cellbox with given dimensions.&lt;br /&gt;
/// @param[in] _x Size by X axis.&lt;br /&gt;
/// @param[in] _y Size by Y axis.&lt;br /&gt;
/// @param[in] _z Size by Z axis.&lt;br /&gt;
/// @return True if allocation succeeded.&lt;br /&gt;
bool CellBox::Allocate(int _x, int _y, int _z)&lt;br /&gt;
&lt;br /&gt;
/// Clear data, free memory.&lt;br /&gt;
void CellBox::Clear()&lt;br /&gt;
&lt;br /&gt;
/// Set all the elements to given value.&lt;br /&gt;
/// @param[in] v Value to set.&lt;br /&gt;
void CellBox::Set(int v);&lt;br /&gt;
&lt;br /&gt;
/// Get an access to the specified cell.&lt;br /&gt;
/// @param[in] i Coordinate by X axis.&lt;br /&gt;
/// @param[in] j Coordinate by Y axis.&lt;br /&gt;
/// @param[in] k Coordinate by Z axis.&lt;br /&gt;
/// @return Reference to element.&lt;br /&gt;
int &amp;amp;CellBox::operator ()(int i, int j, int k)&lt;br /&gt;
&lt;br /&gt;
/// Get cellbox height (by Z axis) in range [0; 1].&lt;br /&gt;
/// @param[in] i Coordinate by X axis.&lt;br /&gt;
/// @param[in] j Coordinate by Y axis.&lt;br /&gt;
/// @return Reference to height value.&lt;br /&gt;
float &amp;amp;CellBox::Height(int i, int j)&lt;br /&gt;
&lt;br /&gt;
/// Get cellbox's sizes.&lt;br /&gt;
int CellBox::X()&lt;br /&gt;
int CellBox::Y()&lt;br /&gt;
int CellBox::Z()&lt;br /&gt;
int CellBox::DataSize()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cloud engine ====&lt;br /&gt;
&lt;br /&gt;
Class CloudEngine is a main class in Cloud modelling system. Used for forming and maintaining single scene cloud object (CloudEff).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
class CloudEngine&lt;br /&gt;
{&lt;br /&gt;
public:&lt;br /&gt;
	CloudEngine();&lt;br /&gt;
	~CloudEngine();&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	struct Particle&lt;br /&gt;
	{&lt;br /&gt;
		Vect3f v;&lt;br /&gt;
		float a, r, g, b;&lt;br /&gt;
		float size;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	struct ScatParams&lt;br /&gt;
	{&lt;br /&gt;
		enum Type&lt;br /&gt;
		{&lt;br /&gt;
			LINEAR = 0,		&lt;br /&gt;
			QUAD = 1,		&lt;br /&gt;
			POLY_05 = 2		&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		Type type;&lt;br /&gt;
		float a, b, c;&lt;br /&gt;
		float width;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
	enum HorMapType  // bits&lt;br /&gt;
	{&lt;br /&gt;
		HEIGHT = 1,&lt;br /&gt;
		POSSIBILITY = 2&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
public:&lt;br /&gt;
	// Get cell size&lt;br /&gt;
	inline float &amp;amp;CellSize();&lt;br /&gt;
	// Get result particles count&lt;br /&gt;
	inline int NumData();&lt;br /&gt;
	// Get result particles positions&lt;br /&gt;
	inline Particle *GetData();&lt;br /&gt;
&lt;br /&gt;
	inline ScatParams &amp;amp;GetScatParams();&lt;br /&gt;
&lt;br /&gt;
	// Set proper cell size before call&lt;br /&gt;
	inline void SetBlurFactor(float val);&lt;br /&gt;
&lt;br /&gt;
	// Arrange particles inside of mesh.&lt;br /&gt;
	void BuildParticles(float *verts, unsigned int *trgs, &lt;br /&gt;
		int num_verts, int num_trgs);&lt;br /&gt;
	// Rebuild particles from array.&lt;br /&gt;
	void RebuildParticles(const TArray&amp;lt;Vect3f&amp;gt; &amp;amp;parts);&lt;br /&gt;
	// Remove invisible particles.&lt;br /&gt;
	void ClearupParticles();&lt;br /&gt;
	// Apply light settings to shade particles.&lt;br /&gt;
	void ApplyLighting(const Vect3f &amp;amp;dir, const Vect3f &amp;amp;view_dir, &lt;br /&gt;
		const Vect3f &amp;amp;color, &lt;br /&gt;
		const Vect3f &amp;amp;back_color, const Vect3f &amp;amp;sun_color);&lt;br /&gt;
	// Dissolve particles vertically.&lt;br /&gt;
	void DissolveVerticalLayers(const ScatParams &amp;amp;pps, &lt;br /&gt;
		const ScatParams &amp;amp;height_density);&lt;br /&gt;
	// Apply height map.&lt;br /&gt;
	void ApplyHorDissolveMap(const ScatParams &amp;amp;col, unsigned int *cmap, &lt;br /&gt;
		short map_w, short map_h, unsigned int type);&lt;br /&gt;
&lt;br /&gt;
protected:&lt;br /&gt;
	void ClearData();&lt;br /&gt;
&lt;br /&gt;
	float TraceRayFromCell(const Vect3f &amp;amp;dir, int i, int j, int k);&lt;br /&gt;
	void TraceCollectFromCell(TArray&amp;lt;Vect3f&amp;gt; &amp;amp;res, const Vect3f &amp;amp;dir, &lt;br /&gt;
		int i, int j, int k);&lt;br /&gt;
	float Scattering(float dist, const ScatParams &amp;amp;sp);&lt;br /&gt;
&lt;br /&gt;
	float CalcDensity(int i, int j, int k);&lt;br /&gt;
	float GetDensity(int imax, int i, int j, int k);&lt;br /&gt;
	float DensityWeightFunc(int di, int dj, int dk);&lt;br /&gt;
	float DensityFieldFunc(float distr, float maxr);&lt;br /&gt;
&lt;br /&gt;
private:&lt;br /&gt;
	// Cell size in world units&lt;br /&gt;
	float m_cell_size;&lt;br /&gt;
	// Max radius used in density calculations&lt;br /&gt;
	float m_max_rad;&lt;br /&gt;
	// Particles&lt;br /&gt;
	TArray&amp;lt;Particle&amp;gt; m_parts;&lt;br /&gt;
	// AABB&lt;br /&gt;
	Vect3f bbmin, bbmax;&lt;br /&gt;
	CellBox cell_box;&lt;br /&gt;
	ScatParams scat_params;&lt;br /&gt;
&lt;br /&gt;
	// Working array (for speedup)&lt;br /&gt;
	TArray&amp;lt;float&amp;gt; part_density;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Public functionality:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/// Constructor.&lt;br /&gt;
CloudEngine::CloudEngine()&lt;br /&gt;
&lt;br /&gt;
/// Destructor.&lt;br /&gt;
CloudEngine::~CloudEngine()&lt;br /&gt;
&lt;br /&gt;
/// Get cell size member.&lt;br /&gt;
/// @return Reference to cellsize member.&lt;br /&gt;
float &amp;amp;CloudEngine::CellSize()&lt;br /&gt;
&lt;br /&gt;
/// Get result particles count.&lt;br /&gt;
/// @return Particles count.&lt;br /&gt;
int CloudEngine::NumData()&lt;br /&gt;
&lt;br /&gt;
/// Get result particles positions.&lt;br /&gt;
/// @return Pointer to the result data.&lt;br /&gt;
Particle *CloudEngine::GetData()&lt;br /&gt;
&lt;br /&gt;
/// Get access to scattering params.&lt;br /&gt;
/// @return Reference to scat_params member.&lt;br /&gt;
ScatParams &amp;amp;CloudEngine::GetScatParams()&lt;br /&gt;
&lt;br /&gt;
/// Set blur multiplicier. &lt;br /&gt;
/// Note: Set proper cell size before call.&lt;br /&gt;
/// @param[in] val New value.&lt;br /&gt;
void CloudEngine::SetBlurFactor(float val)&lt;br /&gt;
&lt;br /&gt;
/// Arrange particles inside of mesh. &lt;br /&gt;
/// @param[in] verts Mesh vertices.&lt;br /&gt;
/// @param[in] trgs Mesh triangles.&lt;br /&gt;
/// @param[in] num_verts Vertices count.&lt;br /&gt;
/// @param[in] num_trgs Triangles count * 3.&lt;br /&gt;
void CloudEngine::BuildParticles(float *verts, unsigned int *trgs, &lt;br /&gt;
	int num_verts, int num_trgs)&lt;br /&gt;
&lt;br /&gt;
/// Rebuild particles from array. Avoid full list rebuild.&lt;br /&gt;
/// @param[in] parts Particles positions.&lt;br /&gt;
void CloudEngine::RebuildParticles(const TArray&amp;lt;Vect3f&amp;gt; &amp;amp;parts)&lt;br /&gt;
&lt;br /&gt;
/// Remove invisible particles.&lt;br /&gt;
void CloudEngine::ClearupParticles();&lt;br /&gt;
&lt;br /&gt;
/// Apply light settings to shade particles.&lt;br /&gt;
/// @param[in] dir Direction to the sun.&lt;br /&gt;
/// @param[in] view_dir Current observer's viewing direction.&lt;br /&gt;
/// @param[in] color Cloud color.&lt;br /&gt;
/// @param[in] back_color Background color.&lt;br /&gt;
/// @param[in] sun_color Sun color.&lt;br /&gt;
void CloudEngine::ApplyLighting(const Vect3f &amp;amp;dir, const Vect3f &amp;amp;view_dir, &lt;br /&gt;
	const Vect3f &amp;amp;color, const Vect3f &amp;amp;back_color, const Vect3f &amp;amp;sun_color)&lt;br /&gt;
&lt;br /&gt;
/// Dissolve particles vertically.&lt;br /&gt;
/// @param[in] pps Scattering params.&lt;br /&gt;
/// @param[in] height_density Params for height density.&lt;br /&gt;
void CloudEngine::DissolveVerticalLayers(const ScatParams &amp;amp;pps, &lt;br /&gt;
	const ScatParams &amp;amp;height_density)&lt;br /&gt;
&lt;br /&gt;
/// Apply height map.&lt;br /&gt;
/// @param[in] col Scattering for color.&lt;br /&gt;
/// @param[in] cmap Color map.&lt;br /&gt;
/// @param[in] map_w Map width.&lt;br /&gt;
/// @param[in] map_h Map height.&lt;br /&gt;
/// @param[in] type Map type (HEIGHT or POSSIBILITY).&lt;br /&gt;
void CloudEngine::ApplyHorDissolveMap(const ScatParams &amp;amp;col, unsigned int *cmap, &lt;br /&gt;
	short map_w, short map_h, unsigned int type)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Folders structure ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
soc-blender/&lt;br /&gt;
   projectfiles_vc7/&lt;br /&gt;
      blender/&lt;br /&gt;
         BSG_SkyGen/&lt;br /&gt;
            BSG_SkyGen.vcproj&lt;br /&gt;
   source/&lt;br /&gt;
      blender/&lt;br /&gt;
         BSG_SkyGen/&lt;br /&gt;
            BSG_SkyGen.h       // Interface header&lt;br /&gt;
            intern/&lt;br /&gt;
               BSG_SkyGen.cpp  // Interface functions implementation&lt;br /&gt;
&lt;br /&gt;
               // Common modules&lt;br /&gt;
               sky_math.h          // Auxiliary math&lt;br /&gt;
               sky_math.cpp &lt;br /&gt;
&lt;br /&gt;
               ref.h               // Auxiliary templates&lt;br /&gt;
               array.h&lt;br /&gt;
&lt;br /&gt;
               // Cloud module&lt;br /&gt;
               CloudEngine.h&lt;br /&gt;
               CloudEngine.cpp&lt;br /&gt;
&lt;br /&gt;
               ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>wiki&gt;Sionix</name></author>
		
	</entry>
</feed>