Jump to content

  • Log In with Google      Sign In   
  • Create Account

fastcall22

Member Since 04 Feb 2008
Offline Last Active Today, 12:39 AM

#5280038 Registry Entry Locator

Posted by fastcall22 on 07 March 2016 - 12:07 PM

Check the documentation for Microsoft.Win32.RegistryKey in mscorlib.dll, it has extensive details and examples on how to use it.


#5280029 For beginners

Posted by fastcall22 on 07 March 2016 - 11:22 AM

idk anything about allegro


Most libraries have tutorials to get you started, and reference documentation to show how things are done.


#5279851 Why rotation of 1.57 radian in x would face downwards?

Posted by fastcall22 on 06 March 2016 - 11:49 AM

Are your XYZ to yaw-pitch-roll correct? According to D3DXQuaternionRotationYawPitchRoll, yaw should be +Y, pitch should be +X, and roll should be +Z (or -Z, depending on LH or RH).

Since your model is facing +X, you might want to swap pitch and roll here.


#5277338 Vertex welding, preserve creases?

Posted by fastcall22 on 21 February 2016 - 04:04 PM

Is something like Beldner’s edge-split what you’re looking for? I believe the algorithm goes something like:

1. Iterate over all edges.
2. Check angle between the triangles sharing this edge.
3. If the angle is above a certain threshold, then crease this edge by creating new vertices with different normals.


#5277332 Managing game object IDs

Posted by fastcall22 on 21 February 2016 - 03:26 PM

Disclaimer: Haven’t actually implemented a serialization system.

Here’s what I’m thinking:
1. UUIDs to identify types.
2. Physical memory address for objects IDs, if appropriate, otherwise an integer handle.
3. Serialized data should contain a header.
4. Header should contain a list of UUIDs used in the file. Use indexes into this list rather than full UUIDs.
5. When using physical address as object IDs, collapse to a uint16_t.


#5276165 They called me crazy!

Posted by fastcall22 on 17 February 2016 - 12:57 PM

But does it support FILE_NOT_FOUND?


#5275858 Data linking varibles

Posted by fastcall22 on 15 February 2016 - 11:22 PM

It is arbitrary. However, the more I think about it, I think it should go toward the selected slider. Just a thought, though.


#5275789 Data linking varibles

Posted by fastcall22 on 15 February 2016 - 12:24 PM

For the list, L=(1, 50, 25, 24), and a selected index, idx=0:

1. Find the sum of the others: sum = 50 + 25 + 24 = 99. You may want to cache these ratios until idx changes.
2. After changing L[idx], find remaining amount: remaining = 100-L[idx]
3. Adjust other values according to their proportion, with rounding: (L[jdx]*remaining)/sum.
4. Add or remove 1 to one of the other sliders to correctly account for rounding corner cases, if the sum doesn’t match 100.


EDIT:
Here’s a quick test in powershell:
foreach ( $z in ((50,25,24), (25,25,25)) ) {
  foreach ( $y in (0,1,50,99,100) ) {
    $remaining = 100-$y;
    $total = $z | measure -sum | select -expand sum;
    $others = $z |% {
      [Math]::floor(($_*$remaining + $total/2)/$total);
    };
    $all = ,$y + $others;
    $sum = $all | measure -sum | select -expand sum;

    $adj = 100-$sum;
    $all[1] += $adj;
    $sum += $adj;

    "sliders=$all sum=$sum"
  }
}

sliders= ​ 0 ​ 51 ​ 25 ​ 24 sum=100
sliders= ​ 1 ​ 50 ​ 25 ​ 24 sum=100
sliders= 50 ​ 25 ​ 13 ​ 12 sum=100
sliders= 99 ​ ​ 1 ​ ​ 0 ​ ​ 0 sum=100
sliders=100 ​ ​ 0 ​ ​ 0 ​ ​ 0 sum=100

sliders= ​ 0 ​ 34 ​ 33 ​ 33 sum=100
sliders= ​ 1 ​ 33 ​ 33 ​ 33 sum=100
sliders= 50 ​ 16 ​ 17 ​ 17 sum=100
sliders= 99 ​ ​ 1 ​ ​ 0 ​ ​ 0 sum=100
sliders=100 ​ ​ 0 ​ ​ 0 ​ ​ 0 sum=100



#5275603 Using SQL for Templated Data

Posted by fastcall22 on 14 February 2016 - 02:56 AM

Sorry. I only partially answered the question. You may want to check to see if common table expressions are supported by your database engine. Some popular database engines are a bit behind the times in supporting modern SQL features (*cough* MySQL *cough*). In any case, assuming a schema:
create table `prefabs` (
    `id` int primary key not null auto_increment,
    `parent_id` int null,
    `name` varchar(50) not null
);

create table `prefab_properties` (
    `id` int primary key not null auto_increment,
    `prefab_id` int not null,
    `property_id` int not null,
    `value` varbinary(128) null
);

create table `properties` (
    `id` int primary key not null auto_increment,
    `name` varchar(100) not null,
    `type` varchar(10) not null /* int, string, color, float, and et. al. */
);
Then you could use CTEs to do something like:
1. Walk the inheritance tree. The CTE will build a set of all parents for every node.
2. Aggregate non-null properties for every node, and select the first property of that type.

with `tree` as ( /* set of all prefabs’ parents */
    select  p.id        `root_id`,
            p.id        `current_id`,
            p.parent_id `parent_id`,
            1           `level`
    from    prefabs p
    where   :has_prefab_ids is null
    or      p.id in :prefab_ids
    union all
    select  t.root_id,
            p.id,
            p.parent_id,
            t.level + 1
    from    tree t
    join    prefabs p
    on      t.parent_id = p.id
), `tree_props` as ( /* join prefabs in `tree` with their non-null properties */
    select  t.*,
            pp.property_id,
            pp.id `pp_id`
    from    tree `t`
    join    prefab_properties `pp`
    on      t.current_id = pp.prefab_id
    where   pp.value is not null
) select
    _1.root_id `prefab_id`,
    _1.property_id,
    pp.value,
    t.current_id `inherited_from`
from ( /* first encountered non-null properties of prefab */
    select  tp.root_id,
            tp.property_id,
            min(tp.level) `min_level`
    from    tree_props `tp`
    group by
            tp.root_id,
            tp.property_id
) _1
inner join /* rejoin tree_props to obtain property value */
    tree_props `tp`
on  _1.root_id = tp.root_id
and _1.property_id = tp.property_id
and _1.min_level = tp.level
inner join
    prefab_properties pp
on  tp.pp_id = pp.id
;
Of course, a sane person might consider calculating effective properties in software, rather than rely on a database to do it for them. smile.png


#5275596 Using SQL for Templated Data

Posted by fastcall22 on 13 February 2016 - 09:13 PM

This is usually done with the coalescing function:
 
with `objects` (`id`,`parent_id`,`name`,`type`,`value`) as ( values
    ( 1, null, 'fruit',     'F', -5 ),
    ( 2, null, 'vegetable', 'B',  7 ),
    ( 3, 1,    'apple',     null, 100 ),
    ( 4, 2,    'carrot',    'X',  null )
) select
    child.id,
    coalesce(child.name, parent.name) `name`,
    coalesce(child.type, parent.type) `type`,
    coalesce(child.value, parent.value) `value`
from
    `objects` child
left outer join
    `objects` parent
on  child.parent_id = parent.id
;
This might be incorrect (modern) SQL syntax, but it should get the point across.


#5273245 Warning conversion from size_t to int in x64

Posted by fastcall22 on 29 January 2016 - 01:35 PM

for (int n = 7; n>=0; --n) ...


Just write it like this, lol:
for ( unsigned n = 7; n <= 7; --n )

Problem solved?


#5271582 Passing 2d char array through functions in c

Posted by fastcall22 on 17 January 2016 - 01:23 PM

To explain the differences, a char[8][12] is 96 contiguous bytes, packed tightly with 8 12-byte strings. To iterate through each string, you advance 12 bytes within the array. A char*[8], however, is 8*sizeof(void*) bytes, with pointers that don't necessarily point within a contiguous array.


#5269999 When you realize how dumb a bug is...

Posted by fastcall22 on 08 January 2016 - 12:32 AM

PS> $L
0.576

PS> $R
-4.132

PS> $L -lt $R
True

PS> 0.576 -lt -4.132
False

PS> $L.GetType().Name
String

PS> throw 'omg powershell pls';



#5268930 Reducing byte transfer between C++ and HLSL.

Posted by fastcall22 on 02 January 2016 - 09:17 PM

Yes, it is possible, but...

You'll do more work unpacking the unsigned on the GPU than you would just passing in the other three floats-- by several orders of magnitude.


#5268668 C++ without pointers

Posted by fastcall22 on 31 December 2015 - 09:57 PM

You cannot get very far without using just pointers in C++. Eventually you'll run into object lifetime issues. See C++ Faq Lite on references.

In summary:

1. A reference cannot be re-seated.
2. An object must be stored somewhere, and you'll run into object slicing.
3. If you want the benefits of references without the "danger" of pointer (not implying that references are inherently safe), then look into using smart pointers instead.


inb4 Servant of the Lord's in depth explanation!




PARTNERS