Thanks for the valuable comments.
Normals - Yes, when to calculate them was a thought of mine. I have done some other basic 3D work before and the normals were actually calculated after transforms. But does this mean they are calculated in the OnPaint event since this is where the WorldtoScreen conversion is carried out? Also how should this work with display lists where they list is supposed to be generated once for all transforms? I can give it a go and see what happens.
Update:- Hmm.. I wasn't thinking about that properly. Does the WorldtoScreen not just normalise all the data for the screen in terms of the values being from 0-1? Would this make a fundamental difference? I'm trying a few things to see what the difference is.
I thought my normals were "pointing out" based on my previous programs but I will take account of your suggestions and review the difference. My other 3D work had Z in the opposite direction to OpenGL so I can imagine it is not right as is.
Good advice on use of Tform1. I tried to learn Delphi many years ago and didn't really do any proper studying on it. I just followed some snippets of code and managed to make them work, eventually. My biggest adventure was a complete 2D CAD package that works pretty well with lots of features but I am scared to look back on it now because it will be a real mess with such issues in its 50,000 lines of code!
Arrays - Good advice, again I just did what worked in the past but know dynamic arrays are better. Something I can implement in all my programs going forward.
Normally I can handle the maths and fundamental scope of such programs, but I am never very elegant in my coding or in employing best practice so thanks for the tips, I will get working on it.
In my work we have to create lots of curves and so next up is trying to accommodate parametric splines and Akima fits, good for sharp turns and reversals, although they don't generate simple formulas for spreadsheets.
Update:- Lighting being called many times - that was me fiddling with trying to get it to work and was on the cards to tidy up once I got it to work reasonably well
Update:- Pyramids - Since the pyramids represent the actual data point, they lie precisely on the curve and I guess it is which gets drawn first, pyramid or curve surface. The centre of the pyramid is the point so if it were a flat surface you should see a little pyramid above the surface and a frustrum below. Sometimes the pyramid is inside the cube which means the calculated and actual points are the same