<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">Index: release/scripts/startup/bl_ui/properties_texture.py
===================================================================
--- release/scripts/startup/bl_ui/properties_texture.py	(Revision 49766)
+++ release/scripts/startup/bl_ui/properties_texture.py	(Arbeitskopie)
@@ -329,6 +329,57 @@
         col.prop(tex, "nabla")
 
 
+class TEXTURE_PT_lyapunov(TextureTypePanel, Panel):
+    bl_label = "Lyapunov"
+    tex_type = 'LYAPUNOV'
+    COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME'}
+
+    def draw(self, context):
+        layout = self.layout
+        tex = context.texture
+
+        layout.prop(tex, "lyap_color_type", expand=True)
+
+        row = layout.row()
+        if tex.lyap_color_type in {'RGB', 'RGBA'}:
+            row.prop(tex, "lyap_neg_color_r", text="")
+            row.prop(tex, "lyap_mid_color_r", text="")
+            row.prop(tex, "lyap_pos_color_r", text="")
+        else:
+            row.prop(tex, "lyap_intensity_spreading")
+
+        split = layout.split()
+        row = split.row()
+
+        sub = row.row()
+        sub.active = tex.lyap_render_type in {'ALL', 'NEG'}
+        sub.prop(tex, "lyap_neg_invert")
+        sub.prop(tex, "lyap_neg_scale")
+
+        sub1 = row.row()
+        sub1.active = tex.lyap_render_type in {'ALL', 'POS'}
+        sub1.prop(tex, "lyap_pos_invert")
+        sub1.prop(tex, "lyap_pos_scale")
+
+        layout.prop(tex, "lyap_render_type", expand=True)
+
+        split = layout.split()
+        col = split.column()
+
+        col.prop(tex, "lyap_iteration_pre")
+        col.prop(tex, "lyap_iteration_main")
+
+        col = split.column()
+
+        col.prop(tex, "lyap_param1")
+        col.prop(tex, "lyap_param2")
+
+        split = layout.split()
+        row = split.row()
+
+        row.prop(tex, "noise_scale", text="Size")
+        row.prop(tex, "nabla")
+
 class TEXTURE_PT_magic(TextureTypePanel, Panel):
     bl_label = "Magic"
     tex_type = 'MAGIC'
Index: intern/cycles/blender/addon/ui.py
===================================================================
--- intern/cycles/blender/addon/ui.py	(Revision 49766)
+++ intern/cycles/blender/addon/ui.py	(Arbeitskopie)
@@ -969,6 +969,7 @@
         bpy.types.TEXTURE_PT_clouds,
         bpy.types.TEXTURE_PT_wood,
         bpy.types.TEXTURE_PT_marble,
+        bpy.types.TEXTURE_PT_lyapunov,
         bpy.types.TEXTURE_PT_magic,
         bpy.types.TEXTURE_PT_blend,
         bpy.types.TEXTURE_PT_stucci,
Index: source/blender/makesdna/DNA_texture_types.h
===================================================================
--- source/blender/makesdna/DNA_texture_types.h	(Revision 49766)
+++ source/blender/makesdna/DNA_texture_types.h	(Arbeitskopie)
@@ -251,7 +251,30 @@
 	
 	char use_nodes;
 	char pad[7];
-	
+
+	/* Lyapunov parameters */
+	short lyap_render_type , lyap_color_type, lyap_flag, pad4;
+	float lyap_iteration_pre, lyap_iteration_main;
+
+	float lyap_neg_scale, lyap_pos_scale;
+
+	float lyap_param1, lyap_param2;
+
+	float lyap_neg_color_r;
+	float lyap_neg_color_g;
+	float lyap_neg_color_b;
+	float lyap_neg_color_a;
+
+	float lyap_mid_color_r;
+	float lyap_mid_color_g;
+	float lyap_mid_color_b;
+	float lyap_mid_color_a;
+
+	float lyap_pos_color_r;
+	float lyap_pos_color_g;
+	float lyap_pos_color_b;
+	float lyap_pos_color_a;
+
 } Tex;
 
 /* used for mapping and texture nodes. note: rot is now in radians */
@@ -306,6 +329,7 @@
 #define TEX_POINTDENSITY	14
 #define TEX_VOXELDATA		15
 #define TEX_OCEAN		16
+#define TEX_LYAPUNOV	17
 
 /* musgrave stype */
 #define TEX_MFRACTAL		0
@@ -590,6 +614,14 @@
 #define TEX_OCN_GENERATE_NORMALS	1	
 #define TEX_OCN_XZ				2	
 	
+/******************** Lyapunov **************************/
+#define TEX_LYAP_ALL			0
+#define TEX_LYAP_POS			1
+#define TEX_LYAP_NEG			2
+
+#define TEX_LYAP_INT			0
+#define TEX_LYAP_RGB			1
+
 #ifdef __cplusplus
 }
 #endif
Index: source/blender/makesrna/RNA_access.h
===================================================================
--- source/blender/makesrna/RNA_access.h	(Revision 49766)
+++ source/blender/makesrna/RNA_access.h	(Arbeitskopie)
@@ -292,6 +292,7 @@
 extern StructRNA RNA_LimitRotationConstraint;
 extern StructRNA RNA_LimitScaleConstraint;
 extern StructRNA RNA_LockedTrackConstraint;
+extern StructRNA RNA_LyapunovTexture;
 extern StructRNA RNA_Macro;
 extern StructRNA RNA_MagicTexture;
 extern StructRNA RNA_MarbleTexture;
Index: source/blender/makesrna/intern/rna_texture.c
===================================================================
--- source/blender/makesrna/intern/rna_texture.c	(Revision 49766)
+++ source/blender/makesrna/intern/rna_texture.c	(Arbeitskopie)
@@ -63,6 +63,7 @@
 	{TEX_ENVMAP, "ENVIRONMENT_MAP", ICON_IMAGE_DATA,
 	             "Environment Map", "Create a render of the environment mapped to a texture"},
 	{TEX_IMAGE, "IMAGE", ICON_IMAGE_DATA, "Image or Movie", "Allow for images or movies to be used as textures"},
+	{TEX_LYAPUNOV, "LYAPUNOV", ICON_TEXTURE, "Lyapunov", "Procedural - Lyapunov fat Fractal"},
 	{TEX_MAGIC, "MAGIC", ICON_TEXTURE, "Magic", "Procedural - color texture based on trigonometric functions"},
 	{TEX_MARBLE, "MARBLE", ICON_TEXTURE, "Marble", "Procedural - marble-like noise texture with wave generated bands"},
 	{TEX_MUSGRAVE, "MUSGRAVE", ICON_TEXTURE, "Musgrave", "Procedural - highly flexible fractal noise texture"},
@@ -128,6 +129,8 @@
 			return &amp;RNA_EnvironmentMapTexture;
 		case TEX_IMAGE:
 			return &amp;RNA_ImageTexture;
+		case TEX_LYAPUNOV:
+			return &amp;RNA_LyapunovTexture;
 		case TEX_MAGIC:
 			return &amp;RNA_MagicTexture;
 		case TEX_MARBLE:
@@ -1035,6 +1038,119 @@
 
 }
 
+static void rna_def_texture_lyapunov(BlenderRNA *brna)
+{
+	StructRNA *srna;
+	PropertyRNA *prop;
+
+	static EnumPropertyItem prop_render_type[] = {
+	    {TEX_LYAP_NEG, "NEG", 0, "negativ", "Negative Lyapunov indices only"},
+	    {TEX_LYAP_ALL, "ALL", 0, "both", "Positive and negative indices"},
+	    {TEX_LYAP_POS, "POS", 0, "positive", "Positive Lyapunov indices only"},
+		{0, NULL, 0, NULL, NULL}
+	};
+
+	static EnumPropertyItem prop_color_type[] = {
+	    {TEX_LYAP_INT, "INTENSITY", 0, "intensity", "Intensity only, you can use a color ramp to colorize"},
+		{TEX_LYAP_RGB, "RGB", 0, "colors", "Renders RGBA values"},
+		{0, NULL, 0, NULL, NULL}
+	};
+
+	srna = RNA_def_struct(brna, "LyapunovTexture", "Texture");
+	RNA_def_struct_ui_text(srna, "Lyapunov Texture", "semmi's procedural fat fractal texture");
+	RNA_def_struct_sdna(srna, "Tex");
+
+	prop = RNA_def_property(srna, "lyap_render_type", PROP_ENUM, PROP_NONE);
+	RNA_def_property_enum_items(prop, prop_render_type);
+	RNA_def_property_ui_text(prop, "Render Type", "");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+	prop = RNA_def_property(srna, "lyap_color_type", PROP_ENUM, PROP_NONE);
+	RNA_def_property_enum_items(prop, prop_color_type);
+	RNA_def_property_ui_text(prop, "Color Type", "");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+	prop = RNA_def_property(srna, "lyap_iteration_pre", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_range(prop, 0, 10);
+	RNA_def_property_ui_range(prop, 0, 100, 1, 4);
+	RNA_def_property_ui_text(prop, "Pre Iteration ", "How many steps the dynamic system iterate it's start value");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+	prop = RNA_def_property(srna, "lyap_iteration_main", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_range(prop, 1, 100);
+	RNA_def_property_ui_range(prop, 1, 100, 10, 4);
+	RNA_def_property_ui_text(prop, "Main Iteration", "How many steps the dynamic system iterate (keep small to reduce rendertime)");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+
+	prop = RNA_def_property(srna, "lyap_neg_color_r", PROP_FLOAT, PROP_COLOR);
+	RNA_def_property_array(prop, 4);
+	RNA_def_property_ui_text(prop, "Neg Color", "Color for negative Lyapunov indices");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+	prop = RNA_def_property(srna, "lyap_mid_color_r", PROP_FLOAT, PROP_COLOR);
+	RNA_def_property_array(prop, 4);
+	RNA_def_property_ui_text(prop, "Mid Color", "Color for Lyapunov indices near Zero");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+	prop = RNA_def_property(srna, "lyap_pos_color_r", PROP_FLOAT, PROP_COLOR);
+	RNA_def_property_array(prop, 4);
+	RNA_def_property_ui_text(prop, "Pos Color", "Color for positive Lyapunov indices");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+	prop = RNA_def_property(srna, "lyap_neg_scale", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_range(prop, 0, 2);
+	RNA_def_property_ui_range(prop, 0, 2, 1, 2);
+	RNA_def_property_ui_text(prop, "neg scale", "Scale negative Lyapunov indices");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+	prop = RNA_def_property(srna, "lyap_pos_scale", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_range(prop, 0, 2);
+	RNA_def_property_ui_range(prop, 0, 2, 1, 2);
+	RNA_def_property_ui_text(prop, "pos scale", "Scale positive Lyapunov indices");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+	prop = RNA_def_property(srna, "lyap_intensity_spreading", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "lyap_flag", 1);
+	RNA_def_property_ui_text(prop, "spread Lyapunov indices", "Negative indices to intensity&lt;0.5, positive indices to intensity&gt;0.5 (good for col.ramps)");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+	prop = RNA_def_property(srna, "lyap_pos_invert", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "lyap_flag", 2);
+	RNA_def_property_ui_text(prop, "", "Reverse positive Lyapunov indices");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+	prop = RNA_def_property(srna, "lyap_neg_invert", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "lyap_flag", 4);
+	RNA_def_property_ui_text(prop, "", "Reverse nagative Lyapunov indices");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+	prop = RNA_def_property(srna, "lyap_param1", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_range(prop, -100, 100);
+	RNA_def_property_ui_range(prop, -100, 100, 1, 2);
+	RNA_def_property_ui_text(prop, "1.Param", "First parameter for function of dynamic system");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+	prop = RNA_def_property(srna, "lyap_param2", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_range(prop, -100, 100);
+	RNA_def_property_ui_range(prop, -100, 100, 1, 2);
+	RNA_def_property_ui_text(prop, "2.Param", "Second parameter for function of dynamic system");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+	prop = RNA_def_property(srna, "noise_scale", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_float_sdna(prop, NULL, "noisesize");
+	RNA_def_property_range(prop, 0.0001, FLT_MAX);
+	RNA_def_property_ui_range(prop, 0.0001, 2, 10, 2);
+	RNA_def_property_ui_text(prop, "Size", "Scaling the Lyapunov fractal set");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+
+	prop = RNA_def_property(srna, "nabla", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_range(prop, 0.001, 0.1);
+	RNA_def_property_ui_range(prop, 0.001, 0.1, 1, 2);
+	RNA_def_property_ui_text(prop, "Nabla", "Size of derivative offset used for calculating normal");
+	RNA_def_property_update(prop, 0, "rna_Texture_update");
+}
+
 static void rna_def_texture_magic(BlenderRNA *brna)
 {
 	StructRNA *srna;
@@ -2039,6 +2155,7 @@
 	rna_def_texture_pointdensity(brna);
 	rna_def_texture_voxeldata(brna);
 	rna_def_texture_ocean(brna);
+	rna_def_texture_lyapunov(brna);
 	/* XXX add more types here .. */
 
 	RNA_api_texture(srna);
Index: source/blender/nodes/NOD_texture.h
===================================================================
--- source/blender/nodes/NOD_texture.h	(Revision 49766)
+++ source/blender/nodes/NOD_texture.h	(Arbeitskopie)
@@ -71,6 +71,7 @@
 
 void register_node_type_tex_proc_voronoi(struct bNodeTreeType *ttype);
 void register_node_type_tex_proc_blend(struct bNodeTreeType *ttype);
+void register_node_type_tex_proc_lyapunov(struct bNodeTreeType *ttype);
 void register_node_type_tex_proc_magic(struct bNodeTreeType *ttype);
 void register_node_type_tex_proc_marble(struct bNodeTreeType *ttype);
 void register_node_type_tex_proc_clouds(struct bNodeTreeType *ttype);
Index: source/blender/nodes/texture/nodes/node_texture_proc.c
===================================================================
--- source/blender/nodes/texture/nodes/node_texture_proc.c	(Revision 49766)
+++ source/blender/nodes/texture/nodes/node_texture_proc.c	(Arbeitskopie)
@@ -170,6 +170,52 @@
 ProcNoInputs(blend)
 ProcDef(blend)
 
+/* -- LYAPUNOV -- */
+static bNodeSocketTemplate lyapunov_inputs[]= {
+	COMMON_INPUTS,
+	{ SOCK_RGBA, 1, "Neg Color", 0.0f, 0.0f, 1.0f, 1.0f },
+	{ SOCK_RGBA, 1, "Mid Color", 0.0f, 0.0f, 0.0f, 1.0f },
+	{ SOCK_RGBA, 1, "Pos Color", 1.0f, 0.0f, 0.0f, 1.0f },
+	{ SOCK_FLOAT, 1, N_("Neg Scale"), 0.5f, 0.0f, 0.0f, 0.0f,   0.0f, 2.0f, PROP_UNSIGNED },
+	{ SOCK_FLOAT, 1, N_("Pos Scale"), 0.5f, 0.0f, 0.0f, 0.0f,   0.0f, 2.0f, PROP_UNSIGNED },
+	{ SOCK_FLOAT, 1, N_("Prev Iter"), 0.0f, 0.0f, 0.0f, 0.0f,   0.0f, 10.0f, PROP_UNSIGNED },
+	{ SOCK_FLOAT, 1, N_("Main Iter"), 1.0f, 0.0f, 0.0f, 0.0f,   1.0f, 100.0f, PROP_UNSIGNED },
+	{ SOCK_FLOAT, 1, N_("1.Param"), 2.0f, 0.0f, 0.0f, 0.0f,   -100.0f, 100.0f, PROP_NONE },
+	{ SOCK_FLOAT, 1, N_("2.Param"), 2.0f, 0.0f, 0.0f, 0.0f,   -100.0f, 100.0f, PROP_NONE },
+	{ SOCK_FLOAT, 1, N_("Size"),   0.25f, 0.0f, 0.0f, 0.0f,   0.0001f, 2.0f, PROP_UNSIGNED },
+	{ -1, 0, "" }
+};
+static void lyapunov_map_inputs(Tex *tex, bNodeStack **in, TexParams *p, short thread)
+{
+	float out[4];
+	tex_input_rgba(out, in[I+0], p, thread);
+	tex-&gt;lyap_neg_color_r = out[0];
+	tex-&gt;lyap_neg_color_g = out[1];
+	tex-&gt;lyap_neg_color_b = out[2];
+	tex-&gt;lyap_neg_color_a = out[3];
+
+	tex_input_rgba(out, in[I+1], p, thread);
+	tex-&gt;lyap_mid_color_r = out[0];
+	tex-&gt;lyap_mid_color_g = out[1];
+	tex-&gt;lyap_mid_color_b = out[2];
+	tex-&gt;lyap_mid_color_a = out[3];
+
+	tex_input_rgba(out, in[I+2], p, thread);
+	tex-&gt;lyap_pos_color_r = out[0];
+	tex-&gt;lyap_pos_color_g = out[1];
+	tex-&gt;lyap_pos_color_b = out[2];
+	tex-&gt;lyap_pos_color_a = out[3];
+
+	tex-&gt;lyap_neg_scale = tex_input_value(in[I+3], p, thread);
+	tex-&gt;lyap_pos_scale = tex_input_value(in[I+4], p, thread);
+	tex-&gt;lyap_iteration_pre = tex_input_value(in[I+5], p, thread);
+	tex-&gt;lyap_iteration_main = tex_input_value(in[I+6], p, thread);
+	tex-&gt;lyap_param1 = tex_input_value(in[I+7], p, thread);
+	tex-&gt;lyap_param2 = tex_input_value(in[I+8], p, thread);
+	tex-&gt;noisesize = tex_input_value(in[I+9], p, thread);
+}
+ProcDef(lyapunov)
+
 /* -- MAGIC -- */
 static bNodeSocketTemplate magic_inputs[]= {
 	COMMON_INPUTS,
@@ -323,3 +369,4 @@
 TexDef(TEX_NOISE,     C,  noise,     "Noise"    )
 TexDef(TEX_STUCCI,    CV, stucci,    "Stucci"   )
 TexDef(TEX_DISTNOISE, CV, distnoise, "Distorted Noise" )
+TexDef(TEX_LYAPUNOV,  CV, lyapunov,  "Lyapunov" )
Index: source/blender/blenkernel/intern/texture.c
===================================================================
--- source/blender/blenkernel/intern/texture.c	(Revision 49766)
+++ source/blender/blenkernel/intern/texture.c	(Arbeitskopie)
@@ -482,7 +482,36 @@
 	tex-&gt;vn_mexp = 2.5;
 	tex-&gt;vn_distm = 0;
 	tex-&gt;vn_coltype = 0;
+	/* lyapunov */
+	tex-&gt;lyap_render_type = TEX_LYAP_ALL;
+	tex-&gt;lyap_color_type = TEX_LYAP_INT;
+	tex-&gt;lyap_iteration_pre = 0.0f;
+	tex-&gt;lyap_iteration_main = 1.0f;
 
+	tex-&gt;lyap_neg_scale = 0.5f;
+	tex-&gt;lyap_pos_scale = 0.5f;
+
+	tex-&gt;lyap_flag = 1;
+
+	tex-&gt;lyap_param1 = 2.0f;
+	tex-&gt;lyap_param2 = 2.0f;
+
+	tex-&gt;lyap_neg_color_r = 0.0f;
+	tex-&gt;lyap_neg_color_g = 0.0f;
+	tex-&gt;lyap_neg_color_b = 1.0f;
+	tex-&gt;lyap_neg_color_a = 1.0f;
+
+	tex-&gt;lyap_mid_color_r = 0.0f;
+	tex-&gt;lyap_mid_color_g = 0.0f;
+	tex-&gt;lyap_mid_color_b = 0.0f;
+	tex-&gt;lyap_mid_color_a = 1.0f;
+
+	tex-&gt;lyap_pos_color_r = 1.0f;
+	tex-&gt;lyap_pos_color_g = 0.0f;
+	tex-&gt;lyap_pos_color_b = 0.0f;
+	tex-&gt;lyap_pos_color_a = 1.0f;
+	/* -------- */
+
 	if (tex-&gt;env) {
 		tex-&gt;env-&gt;stype = ENV_ANIM;
 		tex-&gt;env-&gt;clipsta = 0.1;
@@ -902,7 +931,7 @@
 	Main *bmain = G.main;
 	char texstr[20][15] = {"None", "Clouds", "Wood", "Marble", "Magic", "Blend",
 		                   "Stucci", "Noise", "Image", "EnvMap", "Musgrave",
-		                   "Voronoi", "DistNoise", "Point Density", "Voxel Data", "Ocean", "", "", ""};
+		                   "Voronoi", "DistNoise", "Point Density", "Voxel Data", "Ocean", "Lyapunov", "", ""};
 	Image *ima;
 	char di[FILE_MAXDIR], fi[FILE_MAXFILE];
 	
Index: source/blender/blenkernel/intern/node.c
===================================================================
--- source/blender/blenkernel/intern/node.c	(Revision 49766)
+++ source/blender/blenkernel/intern/node.c	(Arbeitskopie)
@@ -2159,6 +2159,7 @@
 	register_node_type_tex_proc_blend(ttype);
 	register_node_type_tex_proc_magic(ttype);
 	register_node_type_tex_proc_marble(ttype);
+	register_node_type_tex_proc_lyapunov(ttype);
 	register_node_type_tex_proc_clouds(ttype);
 	register_node_type_tex_proc_wood(ttype);
 	register_node_type_tex_proc_musgrave(ttype);
Index: source/blender/editors/space_node/drawnode.c
===================================================================
--- source/blender/editors/space_node/drawnode.c	(Revision 49766)
+++ source/blender/editors/space_node/drawnode.c	(Arbeitskopie)
@@ -2831,6 +2831,19 @@
 			uiItemR(row, &amp;tex_ptr, "noise_basis_2", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
 			break;
 
+		case TEX_LYAPUNOV:
+			row = uiLayoutRow(col, FALSE);
+			uiItemR(row, &amp;tex_ptr, "lyap_color_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+			row = uiLayoutRow(col, FALSE);
+			uiItemR(row, &amp;tex_ptr, "lyap_intensity_spreading", UI_ITEM_R_EXPAND, IFACE_("spread"), ICON_NONE);
+			row = uiLayoutRow(col, FALSE);
+			uiItemR(row, &amp;tex_ptr, "lyap_pos_invert", UI_ITEM_R_EXPAND, IFACE_("invert pos"), ICON_NONE);
+			row = uiLayoutRow(col, FALSE);
+			uiItemR(row, &amp;tex_ptr, "lyap_neg_invert", UI_ITEM_R_EXPAND, IFACE_("invert neg"), ICON_NONE);
+			row = uiLayoutRow(col, FALSE);
+			uiItemR(row, &amp;tex_ptr, "lyap_render_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+			break;
+
 		case TEX_MAGIC:
 			uiItemR(col, &amp;tex_ptr, "noise_depth", 0, NULL, ICON_NONE);
 			break;
Index: source/blender/render/intern/source/render_texture.c
===================================================================
--- source/blender/render/intern/source/render_texture.c	(Revision 49766)
+++ source/blender/render/intern/source/render_texture.c	(Arbeitskopie)
@@ -406,7 +406,170 @@
 }
 
 /* ------------------------------------------------------------------------- */
+static float lyap_index(Tex *tex, float a, float b, float c)
+{
+	int iter_pre =  (int)floor(tex-&gt;lyap_iteration_pre);
+	int iter_main = (int)floor(tex-&gt;lyap_iteration_main);
+	float nabla_pre = tex-&gt;lyap_iteration_pre - (float)iter_pre;
+	float nabla_main = tex-&gt;lyap_iteration_main - (float)iter_main;
+	float p1 = tex-&gt;lyap_param1;
+	float p2 = tex-&gt;lyap_param2;
+	float x = 0.0f;
+	float x_pre;
+	float index = 0.0f;
+	float index_pre;
+	float ableitung;
 
+	int i;
+	int iter = 0;
+
+	/* pre-iteration */
+	for(i = 0; i &lt; iter_pre; i++)
+	{
+			x = p1*sin(x+a)*sin(x+a)+p2;
+			x = p1*sin(x+b)*sin(x+b)+p2;
+			x = p1*sin(x+c)*sin(x+c)+p2;
+	}
+
+	if (nabla_pre != 0.0f)
+	{
+		x_pre = x;
+		x = p1*sin(x+a)*sin(x+a)+p2;
+		x = p1*sin(x+b)*sin(x+b)+p2;
+		x = p1*sin(x+c)*sin(x+c)+p2;
+		x = x*nabla_pre + x_pre*(1.0f-nabla_pre);
+	}
+
+	/* main-iteration */
+	for(i = 0; i &lt; iter_main; i++)
+	{
+		x = p1*sin(x+a)*sin(x+a)+p2;
+		ableitung = 2.0f*p1*sin(x+a)*cos(x+a);
+		if (ableitung != 0.0f) { index += log(fabs(ableitung)); iter++; }
+
+		x = p1*sin(x+b)*sin(x+b)+p2;
+		ableitung = 2.0f*p1*sin(x+b)*cos(x+b);
+		if (ableitung != 0.0f) { index += log(fabs(ableitung)); iter++; }
+
+		x = p1*sin(x+c)*sin(x+c)+p2;
+		ableitung = 2.0f*p1*sin(x+c)*cos(x+c);
+		if (ableitung != 0.0f) { index += log(fabs(ableitung)); iter++; }
+	}
+
+
+	if (nabla_main == 0.0f)
+	{
+		index = (iter != 0) ? index/(float)(iter) : 0.0f;
+	}
+	else
+	{
+		index_pre = (iter != 0) ? index/(float)(iter) : 0.0f;
+
+		x = p1*sin(x+a)*sin(x+a)+p2;
+		ableitung = 2.0f*p1*sin(x+a)*cos(x+a);
+		if (ableitung != 0.0f) { index += log(fabs(ableitung)); iter++; }
+
+		x = p1*sin(x+b)*sin(x+b)+p2;
+		ableitung = 2.0f*p1*sin(x+b)*cos(x+b);
+		if (ableitung != 0.0f) { index += log(fabs(ableitung)); iter++; }
+
+		x = p1*sin(x+c)*sin(x+c)+p2;
+		ableitung = 2.0f*p1*sin(x+c)*cos(x+c);
+		if (ableitung != 0.0f) { index += log(fabs(ableitung)); iter++; }
+
+		index = (iter != 0) ? index/(float)(iter) : 0.0f;
+		index = index*nabla_main + index_pre*(1.0f-nabla_main);
+	}
+
+	return(index);
+}
+
+static int lyapunov(Tex *tex, float *texvec, TexResult *texres)
+{
+	int rv = TEX_INT;
+	float index;
+
+	index = lyap_index(tex, texvec[0]*tex-&gt;noisesize*4,texvec[1]*tex-&gt;noisesize*4,texvec[2]*tex-&gt;noisesize)*4;
+
+	if ( index &gt; 0.0f &amp;&amp; (tex-&gt;lyap_render_type != TEX_LYAP_NEG) )	{
+		index *= tex-&gt;lyap_pos_scale;
+		if (tex-&gt;lyap_flag &amp; 2) {
+			if (index &gt; 1.0f) { index = 1.0f; }
+			index = 1.0f - index;
+		}
+		if (tex-&gt;lyap_flag &amp; 1) {
+			texres-&gt;tin = 0.5f + index/2.0f;
+		}
+		else {
+			texres-&gt;tin = fabs(index);
+		}
+	}
+	else if ( index &lt; 0.0f &amp;&amp; (tex-&gt;lyap_render_type != TEX_LYAP_POS) ) {
+		index *= tex-&gt;lyap_neg_scale;
+		if (tex-&gt;lyap_flag &amp; 4) {
+			if (index &lt; -1.0f) { index = -1.0f; }
+			index = -1.0f - index;
+		}
+		if (tex-&gt;lyap_flag &amp; 1) {
+			texres-&gt;tin = 0.5f + index/2.0f;
+		}
+		else {
+			texres-&gt;tin = fabs(index);
+		}
+	}
+	else {
+		if (tex-&gt;lyap_flag &amp; 1) {
+			texres-&gt;tin = 0.5f;
+		}
+		else {
+			texres-&gt;tin = 0.0f;
+		}
+	}
+
+
+	if (tex-&gt;lyap_color_type == TEX_LYAP_RGB) {
+		// calculate RGBA Values
+		if ( index &gt; 0.0f &amp;&amp; (tex-&gt;lyap_render_type != TEX_LYAP_NEG)) {
+
+			if (index &gt; 1.0f) { index = 1.0f; }
+			texres-&gt;tr = (tex-&gt;lyap_pos_color_r - tex-&gt;lyap_mid_color_r)*index+tex-&gt;lyap_mid_color_r;
+			texres-&gt;tg = (tex-&gt;lyap_pos_color_g - tex-&gt;lyap_mid_color_g)*index+tex-&gt;lyap_mid_color_g;
+			texres-&gt;tb = (tex-&gt;lyap_pos_color_b - tex-&gt;lyap_mid_color_b)*index+tex-&gt;lyap_mid_color_b;
+			texres-&gt;ta = (tex-&gt;lyap_pos_color_a - tex-&gt;lyap_mid_color_a)*index+tex-&gt;lyap_mid_color_a;
+		}
+		else if ( index &lt; 0.0f &amp;&amp; (tex-&gt;lyap_render_type != TEX_LYAP_POS)) {
+
+			if (index &lt; -1.0f) { index = -1.0f; }			
+			texres-&gt;tr = (tex-&gt;lyap_mid_color_r - tex-&gt;lyap_neg_color_r)*index+tex-&gt;lyap_mid_color_r;
+			texres-&gt;tg = (tex-&gt;lyap_mid_color_g - tex-&gt;lyap_neg_color_g)*index+tex-&gt;lyap_mid_color_g;
+			texres-&gt;tb = (tex-&gt;lyap_mid_color_b - tex-&gt;lyap_neg_color_b)*index+tex-&gt;lyap_mid_color_b;
+			texres-&gt;ta = (tex-&gt;lyap_mid_color_a - tex-&gt;lyap_neg_color_a)*index+tex-&gt;lyap_mid_color_a;
+		}
+		else {
+			texres-&gt;tr = tex-&gt;lyap_mid_color_r;
+			texres-&gt;tg = tex-&gt;lyap_mid_color_g;
+			texres-&gt;tb = tex-&gt;lyap_mid_color_b;
+			texres-&gt;ta = tex-&gt;lyap_mid_color_a;
+		}
+
+		rv |= TEX_RGB;
+	}
+
+	if (texres-&gt;nor!=NULL) {
+		// calculate bumpnormal
+		texres-&gt;nor[0] =  0.5f + lyap_index(tex, (texvec[0] + tex-&gt;nabla*tex-&gt;noisesize), texvec[1]*tex-&gt;noisesize, texvec[2]*tex-&gt;noisesize)/2.0f;
+		texres-&gt;nor[1] =  0.5f + lyap_index(tex, texvec[0]*tex-&gt;noisesize, (texvec[1] + tex-&gt;nabla)*tex-&gt;noisesize, texvec[2]*tex-&gt;noisesize)/2.0f;
+		texres-&gt;nor[2] =  0.5f + lyap_index(tex, texvec[0]*tex-&gt;noisesize, texvec[1]*tex-&gt;noisesize, (texvec[2] + tex-&gt;nabla)*tex-&gt;noisesize)/2.0f;
+		tex_normal_derivate(tex, texres);
+		rv |= TEX_NOR;
+	}
+
+	BRICONT;
+	return rv;
+}
+
+/* ------------------------------------------------------------------------- */
+
 static int magic(Tex *tex, float *texvec, TexResult *texres)
 {
 	float x, y, z, turb=1.0;
@@ -1118,6 +1281,9 @@
 	case TEX_MARBLE:
 		retval= marble(tex, texvec, texres); 
 		break;
+	case TEX_LYAPUNOV:
+		retval= lyapunov(tex, texvec, texres);
+		break;
 	case TEX_MAGIC:
 		retval= magic(tex, texvec, texres); 
 		break;
</pre></body></html>