Index: cpp/frams/genetics/f9/f9_conv.cpp
===================================================================
--- cpp/frams/genetics/f9/f9_conv.cpp	(revision 1335)
+++ cpp/frams/genetics/f9/f9_conv.cpp	(revision 1336)
@@ -1,4 +1,4 @@
 // This file is a part of Framsticks SDK.  http://www.framsticks.com/
-// Copyright (C) 1999-2023  Maciej Komosinski and Szymon Ulatowski.
+// Copyright (C) 1999-2025  Maciej Komosinski and Szymon Ulatowski.
 // See LICENSE.txt for details.
 
@@ -125,35 +125,79 @@
 void GenoConv_f90::setColors(Model &m, int last_added_part) //sets fixed (independent from genes) colors and widths on a model, purely for aesthetic purposes
 {
-	//a rainbow on Joints: from the first one red, through middle green, to blue or violet - last
-	static int r[] = { 1, 1, 0, 0, 0, 1 };
-	static int g[] = { 0, 1, 1, 1, 0, 0 };
-	static int b[] = { 0, 0, 0, 1, 1, 1 };
-	int maxind = int(std::size(r)) - 1;
-
-	int joints_count = m.getJointCount();
-	for (int i = 0; i < joints_count; i++)
-	{
-		Joint *j = m.getJoint(i);
-		double x = joints_count < 2 ? 0 : (double)i / (joints_count - 1); //0..1, postion in the rainbow
-		double ind = x * maxind;
-		j->vcolor.x = mix(r, maxind, ind);
-		j->vcolor.y = mix(g, maxind, ind);
-		j->vcolor.z = mix(b, maxind, ind);
+	static const bool OLD = false; //old "rainbow" hue gradient
+	if (OLD)
+	{
+		//a rainbow on Joints: from the first one red, through middle green, to blue or violet - last
+		static int r[] = { 1, 1, 0, 0, 0, 1 };
+		static int g[] = { 0, 1, 1, 1, 0, 0 };
+		static int b[] = { 0, 0, 0, 1, 1, 1 };
+		int maxind = int(std::size(r)) - 1;
+
+		int joints_count = m.getJointCount();
+		for (int i = 0; i < joints_count; i++)
+		{
+			Joint *j = m.getJoint(i);
+			double x = joints_count < 2 ? 0 : (double)i / (joints_count - 1); //0..1, position in the rainbow
+			double ind = x * maxind;
+			j->vcolor.x = mix(r, maxind, ind);
+			j->vcolor.y = mix(g, maxind, ind);
+			j->vcolor.z = mix(b, maxind, ind);
+		}
+	}
+	else
+	{
+		int joints_count = m.getJointCount();
+		for (int i = 0; i < joints_count; i++)
+		{
+			Joint *j = m.getJoint(i);
+			Pt3D d = j->part2->p - j->part1->p; //dx,dy,dz
+			double ax = fabs(d.x), ay = fabs(d.y), az = fabs(d.z);
+			// Pairs of colors should be easy to associate as "one family" at a glance, but different so that we use all main six parts of the spectrum.
+			// Colors are slightly brightened to make them more pastel/plastic; extreme saturation pure red=1,0,0 or blue 0,0,1 do not look good.
+			// Find the longest axis (i.e., recover the information from the genotype: was this joint created by LR, BF, or DU?)
+			if ((ax > ay) && (ax > az)) // x
+			{
+				j->vcolor = d.x < 0 ? Pt3D(1, 0.2, 0.2) : Pt3D(1, 0.2, 0.6); // red, purple red
+			}
+			else
+				if ((ay > ax) && (ay > az)) // y
+				{
+					j->vcolor = d.y < 0 ? Pt3D(0.2, 1, 0.2) : Pt3D(0.7, 1, 0.2); //green, yellowish green
+				}
+				else // z
+				{
+					j->vcolor = d.z < 0 ? Pt3D(0.2, 0.2, 1) : Pt3D(0.4, 0.9, 1); //blue, cyanish blue
+				}
+		}
 	}
 
 	int parts_count = m.getPartCount();
-	SList jlist;
-	for (int i = 0; i < parts_count; i++)
-	{
-		Part *p = m.getPart(i);
-		jlist.clear();
-		int count = m.findJoints(jlist, p);
-		Pt3D averagecolor(0, 0, 0); //Parts will get averaged colors from all attached Joints
-		FOREACH(Joint*, j, jlist)
-			averagecolor += j->vcolor;
-		p->vcolor = averagecolor / count;
-	}
-	//m.getPart(0)->vcolor = Pt3D(0, 0, 0); //mark first Part black - a visual aid for easier editing
-	m.getPart(last_added_part)->vcolor = Pt3D(1, 1, 1); //mark last Part white - a visual aid for easier editing
+	if (OLD)
+	{
+		SList jlist;
+		for (int i = 0; i < parts_count; i++)
+		{
+			Part *p = m.getPart(i);
+			jlist.clear();
+			int count = m.findJoints(jlist, p);
+			Pt3D averagecolor(0, 0, 0); //Parts will get averaged colors from all attached Joints
+			FOREACH(Joint*, j, jlist)
+				averagecolor += j->vcolor;
+			p->vcolor = averagecolor / count;
+		}
+	}
+	else
+	{
+		//Parts will get gray colors from darker to brighter, according to their order of creation.
+		for (int i = 0; i < parts_count; i++)
+		{
+			Part *p = m.getPart(i);
+			p->vcolor.x = p->vcolor.y = p->vcolor.z = 0.3 + 0.4 * i / (parts_count - 1); //0.3..0.7, so first (black) and last (white) stand out more
+		}
+	}
+	//The first Part will be black, the last Part will be white - a visual aid for easier matching of the genotype and the corresponding phenotype.
+	if (!OLD)
+		m.getPart(0)->vcolor = Pt3D(0, 0, 0); //mark first Part black - not attractive in OLD sweet and positive color scheme
+	m.getPart(last_added_part)->vcolor = Pt3D(1, 1, 1); //mark last Part white
 }
 
Index: cpp/frams/genetics/f9/f9_oper.cpp
===================================================================
--- cpp/frams/genetics/f9/f9_oper.cpp	(revision 1335)
+++ cpp/frams/genetics/f9/f9_oper.cpp	(revision 1336)
@@ -1,4 +1,4 @@
 // This file is a part of Framsticks SDK.  http://www.framsticks.com/
-// Copyright (C) 1999-2024  Maciej Komosinski and Szymon Ulatowski.
+// Copyright (C) 1999-2025  Maciej Komosinski and Szymon Ulatowski.
 // See LICENSE.txt for details.
 
@@ -152,5 +152,10 @@
 		int pos = ptr - turtle_commands_f9;
 		int axis = pos / 2;
-		style = GENSTYLE_RGBS(axis == 0 ? 200 : 0, axis == 2 ? 200 : 0, axis == 1 ? 200 : 0, GENSTYLE_NONE);
+		bool increase = (pos % 2) == 1; // positive direction (right/forth/up, not left/back/down) gets brighter, two-dimensional rgb colors
+		// same colors as in GenoConv_f90::setColors(), but not brightened (to increase contrast on white background)
+		style = GENSTYLE_RGBS(
+			axis == 0 ? 200 : (axis == 1 && increase) ? 150 : 0, 
+			axis == 1 ? 200 : (axis == 2 && increase) ? 150 : 0, 
+			axis == 2 ? 200 : (axis == 0 && increase) ? 150 : 0, GENSTYLE_NONE);
 	}
 	return style;
