| | | | |
| |
| In lugnet.cad, Carl Nelson wrote:
> What about a flag for default behavior? I've been coding to ignore
> ones with default rotations,
Why? I have a slow PC, and running the mirwiz.exe program is
nearly instantaneous. It's a lookup and 2 matrix multiplies per
part. If the exception matrix lookup fails, use the default matrix.
It would take extra, unneeded code to ignore things. Resist the
urge...
> but there are plenty of parts (especially slopes) that need a
> (-1 0 0 0 1 0 0 0 1) rotation
Stop saying rotation. It makes me think you're not doing it right.
That's a mirror matrix.
> applied when reflected front-to-back
> and it would be nice to have a flag to distinguish those needing
> default behavior from those where the true correction matrix is
> (-1 0 0 0 1 0 0 0 1).
If you *always* do the same matrix math there's no need to
distinguish. If you're not, then you're making extra busy work
for yourself and possibly introducing bugs. Here's the pseudo code.
for (*ALL* parts in the subfile)
{
float m[4][4]; // Tempory working matrix.
float md[4][4] = { // Default = left-right mirror
{-1.0,0.0,0.0,0.0},
{0.0,1.0,0.0,0.0},
{0.0,0.0,1.0,0.0},
{0.0,0.0,0.0,1.0}
};
float *me = md; // Init exception mirror to left-right (the default).
float *mp = md; // Init global subfile mirror to left-right.
for( i=0; i< numExceptions; i++ )
{
if (exception[i] matches this part)
{
// Use the matrix from the exception list (instead of md).
me = exception[i].matrix
// Also use the substitute partname
strcpy(datname, exception[i].datname);
break;
}
}
M4M4Mul(m,LinePtr->v,me); // Run the initial mirror on the part
M4M4Mul(LinePtr->v,mp,m); // Apply global subfile mirror to part
// NOTE: You can set mp to mirror across whatever plane you want.
// The example here mirrors the subfile across the YZ plane.
}
It's simple and it's all done with mirrors, except for a few weird
parts which might contain a rotation and/or translation component
mixed in with the mirroring in the me matrix.
So far I've only found a few door parts that need a translation
component. See http://ldglite.sf.net/mirror.ini for details on
the doors.
Enjoy,
Don
| | | | | | | | | | | | |
| |
| In lugnet.cad, Don Heyse wrote:
> In lugnet.cad, Carl Nelson wrote:
> > What about a flag for default behavior? I've been coding to ignore
> > ones with default rotations,
>
> Why? I have a slow PC, and running the mirwiz.exe program is
> nearly instantaneous. It's a lookup and 2 matrix multiplies per
> part. If the exception matrix lookup fails, use the default matrix.
> It would take extra, unneeded code to ignore things. Resist the
> urge...
Why process something as an exception when the default behavior is needed? It's
all in what one sees as extra, unneeded code. ;-)
Though I just did some timing and I don't see any performance differences
between ignoring them and not.
> > but there are plenty of parts (especially slopes) that need a
> > (-1 0 0 0 1 0 0 0 1) rotation
>
> Stop saying rotation. It makes me think you're not doing it right.
> That's a mirror matrix.
Exception matrix would probably be the best term, since it *always* mirrors and
*may* rotate.
> If you *always* do the same matrix math there's no need to
> distinguish. If you're not, then you're making extra busy work
> for yourself and possibly introducing bugs. Here's the pseudo code.
>
> for (*ALL* parts in the subfile)
> {
> float m[4][4]; // Tempory working matrix.
> float md[4][4] = { // Default = left-right mirror
> {-1.0,0.0,0.0,0.0},
> {0.0,1.0,0.0,0.0},
> {0.0,0.0,1.0,0.0},
> {0.0,0.0,0.0,1.0}
> };
> float *me = md; // Init exception mirror to left-right (the default).
> float *mp = md; // Init global subfile mirror to left-right.
>
> for( i=0; i< numExceptions; i++ )
> {
> if (exception[i] matches this part)
> {
> // Use the matrix from the exception list (instead of md).
> me = exception[i].matrix
> // Also use the substitute partname
> strcpy(datname, exception[i].datname);
> break;
> }
> }
> M4M4Mul(m,LinePtr->v,me); // Run the initial mirror on the part
> M4M4Mul(LinePtr->v,mp,m); // Apply global subfile mirror to part
>
> // NOTE: You can set mp to mirror across whatever plane you want.
> // The example here mirrors the subfile across the YZ plane.
> }
>
> It's simple and it's all done with mirrors, except for a few weird
> parts which might contain a rotation and/or translation component
> mixed in with the mirroring in the me matrix.
My reservation about doing it this way is that it is exclusively tied to a reflection matrix of (-1 0 0 0 1 0 0 0 1)--please see my response to your 2nd message.
> So far I've only found a few door parts that need a translation
> component. See http://ldglite.sf.net/mirror.ini for details on
> the doors.
Same here. BTW, do you want me to send you the parts that I've changed
mirror.ini for already? I've also confirmed some as correct by rotating
different models.
Carl
| | | | | | | | | | | | | | | | | | In lugnet.cad, Carl Nelson wrote:
> Why process something as an exception when the default behavior is needed?
> It's all in what one sees as extra, unneeded code. ;-)
Well, yeah. But it's simpler to process it all -- the only exceptional
processing you need is "look for the part in mirror.ini. If not found, use the
default settings".
With your method, you have to also add "if the matrix looks like MD, then
process with method_a; otherwise, use method_b".
HOWEVER, you should process all parts through the mirroring operation -
otherwise, you can't handle parts at arbitrary orientations. And if you apply
just the reflection matrix (MP), you'll get reversed stud-logos in your
renderings.
> Exception matrix would probably be the best term, since it *always* mirrors > and *may* rotate.
Or transformation matrix, or pre-reflection matrix.
Steve
| | | | | | | | | | | | | | | | | | Oops, I missed replying to one point.
In lugnet.cad, Carl Nelson wrote:
> My reservation about doing it this way is that it is exclusively tied to a
> reflection matrix of (-1 0 0 0 1 0 0 0 1)--please see my response to your
> 2nd message.
If you mean (-1 0 0 0 1 0 0 0 1) as the 'default' matrix, my response is: that default matrix works for *any* reflection across any arbitrary plane.
If you mean (-1 0 0 0 1 0 0 0 1) as the reflection matrix, my response is: Don's algorithm works for *any* reflection across any arbitrary plane.
Steve
| | | | | | | | | | | | | | | | | | In lugnet.cad, Steve Bliss wrote:
> Oops, I missed replying to one point.
>
> In lugnet.cad, Carl Nelson wrote:
> > My reservation about doing it this way is that it is exclusively tied to a
> > reflection matrix of (-1 0 0 0 1 0 0 0 1)--please see my response to your
> > 2nd message.
>
> If you mean (-1 0 0 0 1 0 0 0 1) as the 'default' matrix, my response is:
> that default matrix works for *any* reflection across any arbitrary plane.
>
> If you mean (-1 0 0 0 1 0 0 0 1) as the reflection matrix, my response is:
> Don's algorithm works for *any* reflection across any arbitrary plane.
Uh, I thought we were refering to it as "Steve's algorithm". Are you
having 2nd thoughts? ;^)
Enjoy,
Don
PS. Why am I constantly seeing really long lines in the browser for this
thread. It makes things really hard to read when I have to scroll 2
miles to the right.
| | | | | | | | | | | | | | | | | | | | | In lugnet.cad, Don Heyse wrote:
> Uh, I thought we were refering to it as "Steve's algorithm". Are you
> having 2nd thoughts? ;^)
Sorry, I should have said "Don's pseudo-code". ;)
> PS. Why am I constantly seeing really long lines in the browser for this
> thread. It makes things really hard to read when I have to scroll 2
> miles to the right.
I don't know - I'm replying via the web interface, posting with plain text.
| | | | | | | | | | | | | | | | | | | In lugnet.cad, Steve Bliss wrote:
> Oops, I missed replying to one point.
>
> In lugnet.cad, Carl Nelson wrote:
> > My reservation about doing it this way is that it is exclusively tied to a
> > reflection matrix of (-1 0 0 0 1 0 0 0 1)--please see my response to your
> > 2nd message.
>
> If you mean (-1 0 0 0 1 0 0 0 1) as the 'default' matrix, my response is: that default matrix works for *any* reflection across any arbitrary plane.
>
> If you mean (-1 0 0 0 1 0 0 0 1) as the reflection matrix, my response is: Don's algorithm works for *any* reflection across any arbitrary plane.
Alright, I give up then. I've accomplished my original goal of mirroring a
model, and I'm just confusing and frustrating myself and wasting your and Don's
time with stupid questions.
I've put the newest executable & source code at:
http://www.carlnelson.com/page.asp?SID=1&Page=43
Thanks,
Carl
| | | | | | | | | | | | | | | | | In lugnet.cad, Carl Nelson wrote:
> I've put the newest executable & source code at:
>
> http://www.carlnelson.com/page.asp?SID=1&Page=43
Before I forget, Steve finished examining all the parts, so
I've put the complete mirror.ini file here for now.
http://ldglite.sourceforge.net/mirwiz.zip
Enjoy,
Don
| | | | | | |