We deserve more performance.

People have forgotten that not long ago Operating Systems (pre – Vista era) were designed to fly on slower 5400 rpm HDD’s and megabyte-order RAM.

You may think that performance and speed should be transferable to newer generation software. If an old version was this fast, the next should be at least as fastest if not faster…

It turns out is often the other way around: newer versions are slower and slower. Hiding the incompetence, the spaghetti code or pure bloatware under the rug of hardware improvements.

The excuse is that software now do more, but usually what they do more is the stuff you don’t need, use that often or wanted on the first place.

As always, Greed takes over good companies and the rush to market and to profit is ruining the software landscape when people see normal that newer versions will be more “demanding” on the hardware. The end user is being stolen of performance and nobody seems to care, worse yet, they see it as OK.

The bar to judge newer software should be to run it on older hardware, on hardware where its predecessors where a king, if performance is worse, then something is wrong. Period.

As an example if Windows XP barely trashed a 5400 rpm HDD with 512 MB of RAM then something terribly wrong is happening with Windows 10 that crawls on the same HDD despite having 8x the RAM available…yet people praise it as the fastest OS of the Microsoft house (of course on an SSD). Seriously those people need to try a windows XP 64 on an SSD with 8 GB of RAM to see the real performance they are loosing on Windows 10…and it will only get worse over time because software degradation is proportional to the hardware improvement, so you will barely notice.

We deserve more performance.

Happy new year!

A year is fading, not before bringing us a lot of wonders, a lot of fantasy and art in the hands of countless magicians around the world. Everyday I feel grateful of being part of the amazing people that makes imagination meet reality.

-What do you do? …once in a while a friend ask, and all I can answer is: -where dreams come true!

The great Pixologic team is wishing you all the best for this new year and much more great things awaits for us all.

Thank you everybody.

Happy new year!

Adobe Industry Certifications

As part of my continuous learning process I have decided to take several industry certifications from Adobe here in the U.S. The knowledge is the only thing that nobody can take from you 🙂

Adobe Certified Visual Design Specialist (Photoshop, Illustrator, Indesign), Visual Communication (Photoshop), Print and Digital Media Publication (Indesign),  and Graphic Design and Illustration (Illustrator).

cert2221772598 cert32217645380 cert85217655161 cert97717617301

 

Adobe Industry Certifications

Installing an older version of OS X

notification_center-0

May be you find yourself in a situation where you need to install an older version of OS X, to test a software or to provide support for older versions since not everyone need to move at the speed

that OS releases cycles dictates. In Apple case that’s a problem as they don’t make it easy. Here’s some tips that could help you to do that. Shortly after a new version is released they make it impossible to just run the older installer within a more recent version.

With OS X El Capitan, Yosemite, or Mavericks, you can use a USB flash drive or other removable media as a startup disk from which to install OS X.

1-Using the Disk Utility create the partition where you will install the older version

fusiondiskutility

2-Make sure you have an installer of the old version you need, either from a backup, a disk, an image, etc

3-Mount your USB flash drive or other volume. You could also use a secondary internal partition.

4-Open the Terminal app, which is in the Utilities folder of your Applications folder.

5-Use the createinstallmedia command in Terminal to create the bootable installer.  For detailed usage instructions, make sure that the appropriate Install OS X app is in your Applications folder, then enter one of the following paths in Terminal:

The following examples assume that the OS X installer is in your Applications folder and the name of your USB flash drive or other volume is MyUSB:

Example for El Capitan:

sudo /Applications/Install\ OS\ X\ El\ Capitan.app/Contents/Resources/
createinstallmedia --volume /Volumes/MyUSB--applicationpath 
/Applications/Install\ OS\ X\ El\ Capitan.app

Example for Yosemite:

sudo /Applications/Install\ OS\ X\ Yosemite.app/Contents/Resources/
createinstallmedia --volume /Volumes/MyUSB--applicationpath 
/Applications/Install\ OS\ X\ Yosemite.app

Example for Mavericks:

sudo /Applications/Install\ OS\ X\ Mavericks.app/Contents/Resources/
createinstallmedia --volume /Volumes/MyUSB--applicationpath 
/Applications/Install\ OS\ X\ Mavericks.app

Then restart, press the alt key during boot to select the USB source and start the installation. If you encounter this error along the process This copy of the Install OS X Yosemite application can’t be verified. It may have been corrupted or tampered with during downloading or similar usually is because the system is detecting a more recent date than the valid range for “installing” those versions, in that case you need to follow a few more steps to trick the system date into a valid one:

While at the “Install OS X” boot menu. Pull down the “Utilities” menu option and choose “Terminal” . The manual date format to use is a little weird, it looks something like mmddHHMMccyy.

In simpler terms, that is: Month Date Hour Minute Year, and it’s entered as a solid line with no breaks or spaces between the numbers. Previously go online and research the release date and the valid range of the OS you want to install and then type any date in that range. Disconnect from the internet to perform this step and type on the terminal such a date, for example for Yosemite I’ve used date 120082315 , and then you will be able to proceed with the installation, reconnect to internet and get the correct date back.

 

Installing an older version of OS X

Stroking improvements

To accurately shape a stroke in QuadPaint, the user can create new pinned vertices with double click, in the future more powerful curve controls will be implemented.  Today I’ve improved the implementation by allowing the deformation to be independent from stroke density. (unlike previous algorithm) and I’ve solved a bug that prevented to simultaniously deform linked strokes.

Before:

After

Stroking improvements

QuadPaint control keys

safdgg

 

This is the current main hot keys and actions to control the strokes of QuadPaint, and by changing the boundary you can control the inner quadrangulation.

Right click a vertex allows to smooth and move the stroke.

Hovering a vertex and pressing DEL , remove the vertices.

Double Click a vertex, will pin it so you basically created a new edge freely to move.

Double Click a segment, between 2 vertices will insert a new point, provided that the radius is smaller than the segment, otherwise will capture the closest vertex an pin it.

Ctrl + Click a vertex will split the stroke into 2 strokes.

Pressing +(plus) over a stroke will increase vertices count by 2. (some manual smoothing will be required to make vertices more even, will improve soon)

Pressing – (minus) will decrease by 2

Overlapping 2 vertices will merge them on mouse release.

Overlapping segments will be intersected on mouse up.

The numerical hint tells the number of vertices between 2 pinned points (inclusive), updated at mouse up.

Moving a vertices very far, after release will insert new divisions, moving them too close will merge them to maintain an average distance.

Sometimes the preview snap to surface incorrectly, but the final result will be much better because more smoothing and post process is used at execution time.

 

PS: seems I had some ghosts at my side because the room was completely silent and I got those eerie sounds Bouhahahaha

QuadPaint control keys

QuadPaint: your personal footprint.

 

ear2

Recently I’ve added two preview modes for QuadPaint:

Realtime: Where you can see changes continuously, is better suited for experimentation and small to medium patches.

Performance: Update is done at the end of every change, ideal for medium to large patches.

Off: No preview, use only if the patches have lots of self intersections and vertices count.

In every stroke, new vertices can be added, removed and pinned. Strokes can be cut and weld too. Strokes defines the boundary and also the internal polygon flow.

There are three quadrangulation algorithms as well:

Direct, it will find the optimal way to connect the existing boundary directly.

Paving: Will try to find an optimal tiling based on the boundary

Hybrid: A new algorithm that combines the best of both.

Hope you like it!

Video music: Guts and Bourbon, Kevin MacLeod.
QuadPaint: your personal footprint.

QuadPaint preview

 

Hi

Recently I have ironed out QuadPaint and improved lots of things under the hood. So far it is shaping into an awesome and fast retopology sketch tool.  Strokes also did allow to add, remove, collapse and split vertices for finer control over the output but is still not exposed to the GUI, I will add it soon. I’m considering also live previews so artists can have instant feedback over stroke changes. More importantly is the possibility to be the base of interesting new tools.

Hope you like it!

QuadPaint preview

Arbitrary contour retopology

Hi

Finally I’ve made quite a breakthrough in semiautomatic retopology. What initially started as a prototype tool is evolving into a quite powerful new way to retopologize models in 3DCoat. Giving artists the freedom to experiment in an intuitive way by just drawing patches, arbitrary patches that will be optimally filled with quads.

Artist is not limited to certain number of edges , flatness or any other constraint. Just draw. I’ve also added the possibility to save and load the strokes along with the model.

The core is done, remaining now is the usability and the workflow of the tool, adding a realtime preview among other details. I’m investigating several variants and further optimizations.

I suspect this core quadrangulator algorithm will span many interesting new tools.But wait, I’m saving the real breakthrough for later 😉

PS: Could you suggest me a good (fast, high quality) screen capture program? I’ve tried CamStudio but cannot get +30fps recording  at 1080p 😦  preferably one that is HW accelerated. (using an NVIDIA GT 560M )

Cheers!

 

Arbitrary contour retopology

Spline fitting

Hermite Spline Tangent estimation for curve fitting.

 

Hi all

Dataset fitting? it must be trough the Least squares method! I keep banging in my head for few days refusing to dive into it because for anything but the trivial function

f(x) = A + Bx

it can easily overflow the brain cache and is a heavy calculation for realtime purposes… So I attempted several heuristics that failed for arbitrary datasets (user strokes in this case) and that was a non negotiable requirement for me.

So what’s the problem about? basically you have a stroke between 2 end points, actually just a set of points given because if I knew the stroke equation there would not be problem at all! And I needed to approximate that curve with a 3D Hermite spline of the form:

splineform

TangentsEstimation
Problem: what magnitudes should have the tangents such as the curve best fit the original points?

Where P0 and P1 are the known endpoints. So I need to find the tangents at each of those points M0 and M1 such the resulting spline was the closest possible to that curve.
Finally I decided to get my hands dirty with pen and paper (you thougth programming happens only at a keyboard and in front of a computer? that’s typing or implementing, programming is actually thinking and it happens even when you load the brain with a complex problem and go to sleep!)

I’m posting this mainly for me, so when I find a similar problem in the future and I have flushed my current memory of this, I will remember, I don’t want to struggle again with Google and Stackoverflow to find nothing related there. (or I did a wrong search 😉 ).

How the least squares method works?

TangentsEstimationErrors
Errors between original curve and interpolated one.

You have some datasets {P0, P1 ,… Pi} you want to fit with a mathematical function F(…). That means that the sum of the approximation errors of that function should be as little as possible, ideally 0 so would be a perfect fit. And the error can be calculated as the sum of all the tiny errors for each evaluated point of the dataset squared, because we don’t want errors canceling each other on both sides of the original curve.

Sum

Easy no? well, in order to minimize that error we should take the partials derivatives of that function and set it to 0 for every unknown we want to estimate. In this case we have 2 unknown tangents.
And here’s where the heavy stuff start showing.

partialderivatives

I needed to substitute the equations with the original forms but this brings another problem: it has 3D vectors! and the solution is not as easy as solving the least square for every component (trust me, I even attempted that!) I had to flatten it to a scalar problem.

A coordinate system transformation could have done the trick or a different parametrization:

TangentsEstimationTransformation
Another parametrization perhaps?

But equations where already large and complex enough once substituted and it doesn’t account the case where in the new parametric form 2 or more values could correspond to the same parameter (remember user strokes can be like Brownian motion :P) and perhaps I can explore it once I find a more canonical solution.

And then I realized I could minimize the error LENGTH (scalar) instead of the vector difference. And went back to the beginning rewriting the least square functions:

sumofdist

SumOfDist2

so in order to minimize the error:

partialsBig

Wow, three times longer than before, take into account that each of those terms are a full equation on their own! look at this sample of my pen work 😉

hand written equiations
Substitutions of substitutions…

Is it correct? the reasoning was correct… so I blindly continue developing the solution, calculating the derivatives (Thanks Wolfram Alpa!) and then organize it into Matrix form (AX = B) to finally calculate the solution vector with the tangents magnitude… and crossed my fingers….

Wow, just wow, it worked flawlessly and finally integrate it into my branch of 3DCoat QuadStrips. Is mathematically heavy for realtime but it only runs once at the creation of the spline so performance here is not an issue.
The harder the problem the greater the self satisfaction I get 🙂

Cheers!

Spline fitting

Improving contour partitioning

At the heart of several tools that I have developed in the past lays a contour partitioning algorithm. It was robust and could handle arbitrary contour shapes, but recently I got a bug report assigned related to CloseHoles tool, and after a careful debugging I found that the partition was indeed robust, but not “clean” enough, it could sometimes create fan like splits which was actually undesired.
What started as a routine bug hunt ended up improving greatly the code for a much more neat contour partition algorithm.

Before
Before

After: new algorithm
After: new algorithm

Improving contour partitioning

Quad strips

An incredible powerful and yet conceptually simple tool are quad strips. highly requested by our community! Is on the way 🙂

Using strokes artist can easily create, place and modify full strips of quads with incredible flexibility. I’m still improving the tool flow but will  have auto welding, size control and real-time or near real-time feedback as well.

Quad strips